Sql server 如何计算两个datetime2列之间的间隔(SQL Server)?

Sql server 如何计算两个datetime2列之间的间隔(SQL Server)?,sql-server,intervals,datetime2,Sql Server,Intervals,Datetime2,嗨,我正在计算datetime2类型的两列之间的差异 但是,SQL server(2012)似乎不喜欢以下内容: select cast ('2001-01-05 12:35:15.56786' as datetime2) - cast ('2001-01-01 23:45:21.12347' as datetime2); Msg 8117, Level 16, State 1, Line 2 Operand data type datetime2 is invalid for sub

嗨,我正在计算datetime2类型的两列之间的差异

但是,SQL server(2012)似乎不喜欢以下内容:

select cast ('2001-01-05 12:35:15.56786' as datetime2)
    - cast ('2001-01-01 23:45:21.12347' as datetime2);

Msg 8117, Level 16, State 1, Line 2
Operand data type datetime2 is invalid for subtract operator.
现在,如果我将其转换为datetime类型,它就可以工作了:

select cast (cast ('2001-01-05 12:35:15.56786' as datetime2) as datetime) 
    - cast (cast ('2001-01-01 23:45:21.12348' as datetime2) as datetime);

1900-01-04 12:49:54.443

但是,当我将其转换为datetime时,我正在失去精度(请注意上面的3位小数精度)。在这种情况下,我实际上需要所有5个小数点。有没有办法获得两个datetime2列之间的间隔,并且仍然保持5个小数点的精度?谢谢。

要查找两个日期之间的差异,您需要使用该函数

你可以简单地使用

返回指定日期部分的计数(有符号整数) 在指定的开始日期和结束日期之间跨越边界

不幸的是,试图通过以下方式获得所需的精度:

select DATEDIFF(MICROSECOND, cast('20010101 23:45:21.12347' as datetime2), 
                             cast('20010105 12:35:15.56786' as datetime2)) 
导致溢出错误:

The datediff function resulted in an overflow. 
The number of dateparts separating two date/time instances is too large. 
Try to use datediff with a less precise datepart.
实现所需精度的一种方法是迭代地分解成粒度时间组件(天、小时、分钟、秒等),并使用DateAdd()将其从值中减去,例如


5年后,这不太可能对slavoo有所帮助,但这个冗长的例子可能满足了人们的要求:

    @FromDateTime DATETIME2 = CAST('20010101 23:45:21.12347' AS DATETIME2),
    @ToDateTime DATETIME2 = CAST('20010105 12:35:15.56786' AS DATETIME2),
    @FromMicroSecs NUMERIC,
    @FromDateTimeNoMicroSecs DATETIME,
    @ToMicroSecs NUMERIC,
    @ToDateTimeNoMicroSecs DATETIME;

SELECT
    @FromMicroSecs = DATEPART(MICROSECOND, @FromDateTime),
    @FromDateTimeNoMicroSecs = CAST(DATEADD(MICROSECOND, -1 * @FromMicroSecs, @FromDateTime) AS DATETIME),
    @ToMicroSecs = DATEPART(MICROSECOND, @ToDateTime),
    @ToDateTimeNoMicroSecs = CAST(DATEADD(MICROSECOND, -1 * @ToMicroSecs, @ToDateTime) AS DATETIME);

SELECT
    CAST(DATEDIFF(SECOND, @FromDateTimeNoMicroSecs, @ToDateTimeNoMicroSecs) AS NUMERIC) * 1000000 + @ToMicroSecs - @FromMicroSecs AS AnswerInMicroseconds;```

这是为了计算两个科学指标之间的间隔。存储间隔值,然后将其添加到另一个datetime2以进行预测。虽然两个日期之间的间隔通常没有那么大(上例中为4天)。也许这更现实一点。选择DATEDIFF(微秒,cast('20010101 23:45:21.12347'作为datetime2),cast('20010102 00:05:15.56786'作为datetime2)),它似乎在足够小的时间间隔内工作。也许要注意,这种精度有一个微秒的上限?如果只有SQL server datetime2在这方面的表现与datetime类似,那么我就不必经历这样的麻烦。
The datediff function resulted in an overflow. 
The number of dateparts separating two date/time instances is too large. 
Try to use datediff with a less precise datepart.
remainingAtLowerGranularity = DateAdd(granularity, -1 * numFoundInStep, value)
    @FromDateTime DATETIME2 = CAST('20010101 23:45:21.12347' AS DATETIME2),
    @ToDateTime DATETIME2 = CAST('20010105 12:35:15.56786' AS DATETIME2),
    @FromMicroSecs NUMERIC,
    @FromDateTimeNoMicroSecs DATETIME,
    @ToMicroSecs NUMERIC,
    @ToDateTimeNoMicroSecs DATETIME;

SELECT
    @FromMicroSecs = DATEPART(MICROSECOND, @FromDateTime),
    @FromDateTimeNoMicroSecs = CAST(DATEADD(MICROSECOND, -1 * @FromMicroSecs, @FromDateTime) AS DATETIME),
    @ToMicroSecs = DATEPART(MICROSECOND, @ToDateTime),
    @ToDateTimeNoMicroSecs = CAST(DATEADD(MICROSECOND, -1 * @ToMicroSecs, @ToDateTime) AS DATETIME);

SELECT
    CAST(DATEDIFF(SECOND, @FromDateTimeNoMicroSecs, @ToDateTimeNoMicroSecs) AS NUMERIC) * 1000000 + @ToMicroSecs - @FromMicroSecs AS AnswerInMicroseconds;```