DateTime vs DateTime2时间范围差异

时间:2018-09-20 18:37:18

标签: sql-server date datetime types

在查看DateTimeDateTime2之间的差异时,我注意到已弃用的DateTime数据类型具有从00:00:00.00023:59:59.997的奇数时间范围,而DateTime2数据类型的限制为00:00:00.000000023:59:59.9999999

我推测此限制可能与较早的限制有关,有人可以解释为什么存在此限制吗?

3 个答案:

答案 0 :(得分:1)

这与精度有关。如果将DateTime2定义为DateTime,则可以使其精度与DateTime2(3)相似。精确度7DateTime2的默认值,这是您在问题中看到的。


另请参阅datetime2 (Transact-SQL)文档

  

精度-0至7位数字,精度为100ns。默认精度为7位数字。


另请参阅datetime (Transact-SQL)

  

将时间,日期,datetime2和datetimeoffset数据类型用于新工作。这些类型符合SQL标准。它们更便携。 time,datetime2和datetimeoffset提供更高的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持

答案 1 :(得分:1)

首先要注意的是……不建议使用DATETIME。

差异的原因是原始日期时间的分辨率为3毫秒。较新的DATETIME2的分辨率为100纳秒。

DATETIME的“ 3毫秒”分辨率是为什么在滚动到00:00:00.000之前看到23:59:59.997而不是23:59:59.999

答案 2 :(得分:1)

奇怪的限制和行为(例如最后一位始终为0、3或7)是因为时间部分在内部存储在DATETIME中的原因:

时间部分存储为自00:00:00(12)以来的 ticks 的数量。每个滴答精确地是秒的1/300 。请记住,DATETIME类型只能存储以下值:

00:00:00.000 -- 0 ticks
00:00:00.003 -- 1 tick,      1/300 = 0.003333 sec
00:00:00.007 -- 2 ticks,     2/300 = 0.006666 sec
00:00:00.010 -- 3 ticks,     3/300 = 0.01 sec
00:00:00.997 -- 299 ticks, 299/300 = 0.996666 sec
00:00:01.000 -- 300 ticks, 300/300 = 1 second

由于不可能存储一半或四分之一刻度,DATETIME无法存储或表示介于两者之间的值。例如,如果您尝试存储诸如CAST('2000-01-01 00:00:00.999' AS DATETIME)之类的值,它将四舍五入为2000-01-01 00:00:01.000