为什么CAST('20140904 23:59:59.999'AS datetime)等于'2014-09-05 00:00:00.000'?

时间:2014-09-10 07:53:13

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

亲自试试,也许它与我的环境有某种关系:

查询:

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

结果:

2014-09-05 00:00:00.000

请解释一下这种现象。

更新:Alex提到日期时间值四舍五入为.000,.003或.007秒的增量。问题是为什么?

2 个答案:

答案 0 :(得分:11)

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

我认为你应该使用

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中datetime函数的准确性。

如果您使用的是较新版本的MSSQL,则可能会使用datetime2,因为其准确性为100纳秒。

日期时间2:http://msdn.microsoft.com/en-us/library/bb677335.aspx

答案 1 :(得分:3)

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

  

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

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

  

实际上,SQL Server确实存储了午夜以来的时钟节拍。   每个时钟标记相当于3.33毫秒。那也是   DATETIME数据类型的准确性为1的原因   三百分之一秒。

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

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