【问题标题】:Why CAST('20140904 23:59:59.999' AS datetime) equals '2014-09-05 00:00:00.000'? [duplicate]为什么 CAST('20140904 23:59:59.999' AS datetime) 等于 '2014-09-05 00:00:00.000'? [复制]
【发布时间】:2014-09-10 07:53:13
【问题描述】:

自己试试吧,可能和我的环境有某种关系:

查询:

SELECT CAST('20140904 23:59:59.999' AS datetime)

结果:

2014-09-05 00:00:00.000

请解释一下这个现象。

更新:Alex 提到日期时间值会四舍五入到 0.000、0.003 或 0.007 秒的增量。问题是为什么?

【问题讨论】:

标签: sql-server datetime casting sql-server-2014


【解决方案1】:

datetime values are rounded to increments of .000, .003, or .007 seconds

我认为你应该使用 P>

SELECT CAST('20140904 23:59:59.997' AS datetime)

这会返回:

 2014-09-04 23:59:59.997

您可以在这里找到更多信息:http://msdn.microsoft.com/en-us/library/ms187819.aspx

这是在SQL日期时间函数的精确度。 P>

您很可能使用DATETIME2如果您使用MSSQL的新版本的精度是100个nanosecs。 P>

DATETIME2:http://msdn.microsoft.com/en-us/library/bb677335.aspx P>

【讨论】:

  • 问题是为什么?跨度>
  • @ AnarKhalilov由于datetime类型具有有限的精确度,并且不存储为十进制数? :)注意,datetime2具有更大的精度,例如跨度>
  • @ AnarKhalilov这无疑涉及浮点值的误差。根据this page,SQL标准规定在内部使用IEEE754双精度。跨度>
  • 相关:stackoverflow.com/q/1143259/1313143。特别是对答案评论! SPAN>
  • @ AnarKhalilov我不认为准确毫秒,往往需要在商业软件。科学的软件可能不会在SQL数据库中存放,以这样的理由。 SPAN>
【解决方案2】:

增量是 API 规范的一部分:请参阅 this link

日期时间值四舍五入为 .000、.003 或 .007 的增量 秒,如下表所示。

我发现this link 最后有更好的解释。引用:

实际上,SQL Server 确实将自午夜以来的时钟记号存储在那里。 每个时钟滴答相当于 3.33 毫秒。这也是 DATETIME 数据类型的精度为 1 的原因 百分之三秒。

DATETIME 是 2 x 4 字节(日期 + 时间)。时间部分存储为自午夜以来的刻度数。每个刻度是 3.33 毫秒

如果您需要更高的精度,请查看DATETIME2 类型。 DATETIME2 精度为 100ns。

【讨论】:

  • 显然 DATETIME2 也符合 ISO 8601,这在某些情况下可能很有用。
猜你喜欢
  • 1970-01-01
  • 2017-01-27
  • 2014-08-09
  • 2013-12-06
  • 2014-11-06
  • 2021-07-05
  • 2021-02-08
  • 2019-12-02
  • 1970-01-01
相关资源
最近更新 更多