为什么这个T-SQL日期数学没有得到毫秒的正确值?

时间:2014-06-25 18:56:48

标签: tsql datetime date-math

我想编写一个T-SQL函数,它将SQL Server日期时间值转换为输入日期和01 JANUARY 1970 00:00:00(javascript Date数据类型的引用日期)之间的毫秒数。

create function jDate
(@indate datetime)
returns numeric
as
begin
 declare @datediff int;
 declare @javascriptDay1 DateTime;
 set @javascriptDay1 = cast('19700101 00:00:00.000' as DateTime);
 set @datediff = DateDiff( ms, @javascriptDay1, @indate)
 return (@datediff); 
end

因此,如果我提供函数01 JAN 1970,它应该返回0.它的作用是什么:

declare @indate datetime
set @indate = cast('19700101 00:00:00.000' as datetime)
select dbo.jDate(@indate)

0

如果我喂它02 Jan 1970 00:00:00.000它应该返回一天中的毫秒数,86400000,它会:

declare @indate datetime
set @indate = cast('19700102 00:00:00.000' as datetime)
select dbo.jDate(@indate)

如果我在1969年12月19日23:59:59喂它,它应该返回1000,即一秒钟内的毫秒数。它会这样做。

declare @indate datetime
set @indate = cast('19691231 23:59:59.000' as datetime)
select dbo.jDate(@indate)

但如果我在1970年1月1日00:00:00.088(也就是只有几毫秒的差异)喂它,它应该返回毫秒数, 88 。但它返回 86

declare @indate datetime
set @indate = cast('19700101 00:00:00.088' as datetime)
select dbo.jDate(@indate)

导致两毫秒错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

根据documentationDATETIME数据类型的分辨率将四舍五入为.000,.003或.007秒的增量。

要获得更高的精度,请考虑DATETIME2数据类型。