包含十进制值

时间:2016-04-17 18:00:41

标签: sql sql-server datediff

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

当我使用时:

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

它返回:

7200

当我使用时:

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

它返回:

7200

我不知道为了得到十进制值而遗漏了什么。

由于

2 个答案:

答案 0 :(得分:3)

如果您想要获得差异的毫秒数,并且想要将单位转换为秒,则可以尝试使用以下内容:

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

那将产生:7200.856000

答案 1 :(得分:1)

请注意,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

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