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

Kev*_* Xu 10 sql-server datetime2 intervals

嗨,我正在尝试计算两列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.
Run Code Online (Sandbox Code Playgroud)

现在,如果我将其转换为日期时间类型,它会起作用:

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
Run Code Online (Sandbox Code Playgroud)

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

Mit*_*eat 16

你可以简单地使用DateDiff

返回指定的startdate和enddate之间交叉的指定datepart边界的计数(有符号整数).

select DATEDIFF(MILLISECOND, cast('20010101 23:45:21.12347' as datetime2), 
                             cast('20010105 12:35:15.56786' as datetime2))
Run Code Online (Sandbox Code Playgroud)

不幸的是,尝试获得所需的精度:

select DATEDIFF(MICROSECOND, cast('20010101 23:45:21.12347' as datetime2), 
                             cast('20010105 12:35:15.56786' as datetime2)) 
Run Code Online (Sandbox Code Playgroud)

导致溢出错误:

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.
Run Code Online (Sandbox Code Playgroud)

实现所需精度的一种方法是迭代地分解粒度时间组件(天,小时,分钟,秒等),并使用DateAdd()从值中减去它,例如

remainingAtLowerGranularity = DateAdd(granularity, -1 * numFoundInStep, value)
Run Code Online (Sandbox Code Playgroud)


Igo*_*nko 5

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

select DATEDIFF(millisecond,'20010105 12:35:15.56786','20010101 23:45:21.12347') 
Run Code Online (Sandbox Code Playgroud)