包含十进制值的 2 个时间戳的 datediff()

datediff() of 2 timestamps that contain decimal values

我已经为这个问题纠结了几天,似乎无法弄清楚为什么当我的 getdate() 插入到列中为军事时间格式提供毫秒小数时,我仍然不能似乎能够提取十进制格式的 datediff() 结果。这是否与引擎由于周围的 '' 字符而无法识别小数有关?

当我使用:

select datediff(s,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997')

它returns:

7200

当我使用时:

select cast(datediff(s,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997') as float);

它returns:

7200

我不知道为了生成小数值而遗漏了什么。

谢谢

如果你想得到毫秒的差异,并且你想把单位转换成秒,你可以尝试使用类似下面的东西:

SELECT DATEDIFF(MS,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997') / 1000.0

这将产生:7200.856000

请注意 DATEDIFF(MS, ...) 需要长时间保护,否则会溢出:

SELECT datediff(MS, '2013-06-30 23:59:59.997', '2013-06-01 21:59:59.141')
-- FAILURE: The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large

您可以使用以下溢出安全的方法并为您提供浮点数结果:

SELECT cast(cast('2013-06-01 23:59:59.997' as datetime)-cast('2013-06-01 21:59:59.141' as datetime) as float) * 24.0
-- Returned 2.00023796296296

SELECT cast(cast('2013-06-30 23:59:59.997' as datetime)-cast('2013-06-01 21:59:59.141' as datetime) as float) * 24.0
-- Returned 698.000237962963

我不确定在测量日期期间时区发生变化时此方法如何工作。