【问题标题】:Why is this T-SQL date math not getting the milliseconds correct?为什么这个 T-SQL 日期数学没有得到正确的毫秒数?
【发布时间】:2014-06-25 18:56:48
【问题描述】:

我想编写一个 T-SQL 函数,将 SQL Server 日期时间值转换为输入日期与 1970 年 1 月 1 日 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

如果我在 1970 年 1 月 2 日 00:00:00.000 喂它,它应该返回一天中的毫秒数 86400000,它会这样做:

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

如果我在 1969 年 12 月 31 日 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)

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

【问题讨论】:

标签: tsql datetime date-math


【解决方案1】:

根据documentationDATETIME 数据类型的分辨率四舍五入到 0.000、0.003 或 0.007 秒的增量。

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

【讨论】:

  • 您能否详细说明我们如何到达86?如果我正确理解了文档中关于“准确性”的部分,毫秒块 .088 将向上舍入到 0.090 或向下舍入到 0.084。
  • 您正在处理两个四舍五入的值(考虑 select convert(varchar(50), cast('1970-01-01 00:00:00.088' as datetime),131)),但我预计 ms 差异将四舍五入为 87(而不是 86),遵循与格式化 DATETIME 相同的规则,但情况似乎并非如此,至少在我测试的实例上是这样。
猜你喜欢
  • 2011-06-19
  • 2014-10-12
  • 1970-01-01
  • 2018-11-21
  • 2012-02-19
  • 1970-01-01
  • 2018-10-17
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多