在查看DateTime
和DateTime2
之间的差异时,我注意到已弃用的DateTime
数据类型具有从00:00:00.000
到23:59:59.997
的奇数时间范围,而DateTime2
数据类型的限制为00:00:00.0000000
至23:59:59.9999999
。
我推测此限制可能与较早的限制有关,有人可以解释为什么存在此限制吗?
答案 0 :(得分:1)
这与精度有关。如果将DateTime2
定义为DateTime
,则可以使其精度与DateTime2(3)
相似。精确度7
是DateTime2
的默认值,这是您在问题中看到的。
另请参阅datetime2 (Transact-SQL)文档
精度-0至7位数字,精度为100ns。默认精度为7位数字。
将时间,日期,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(1和2)以来的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
。