我有一个存储过程用于比较两个日期。根据我的应用逻辑,我希望它们相等。然而,比较失败了。原因是其中一个值作为 DATETIME
存储,需要在与另一个 DATETIME2
比较之前进行 CONVERT
转换。显然,这会改变其值。我运行了这个小测试:
DECLARE @DateTime DATETIME='2018-01-18 16:12:25.113'
DECLARE @DateTime2 DATETIME2='2018-01-18 16:12:25.1130000'
SELECT @DateTime, @DateTime2, DATEDIFF(NANOSECOND, @DateTime, @DateTime2)
给出以下结果:
![-333333ns difference](https://istack.dev59.com/5t6D6.webp)
DATETIME2
作为更精确的类型,应该能够准确地表示在 DATETIME
中可以存储的所有值吗?DATETIME2 的文档 只是说:
没有关于转换会将333333纳秒加入或从值中减去的警告!那么为什么会发生这种情况呢?当转换来自 datetime 时,日期和时间被复制。小数位精度扩展到 7 位。
我正在使用 SQL Server 2016。
编辑:奇怪的是,在另一台服务器上我得到了零差异。两者都是SQL Server 2016,但存在问题的服务器兼容级别设置为130,而没有问题的服务器兼容级别设置为120。在它们之间切换会改变这种行为。
编辑2:DavidG 在评论中提出,我正在使用的值可以表示为
DATETIME2
,但不能表示为 DATETIME
。因此,我修改了我的测试以确保我给 @DateTime2
分配的值是有效的 DATETIME
值。DECLARE @DateTime DATETIME='2018-01-18 16:12:25.113'
DECLARE @DateTime2 DATETIME2=CONVERT(DATETIME2, @DateTime)
SELECT @DateTime, @DateTime2, DATEDIFF(NANOSECOND, @DateTime, @DateTime2)
2018-01-18 16:12:25.113
这个值无法在datetime
值中表示。 - DavidG0
。 - HoneyBadger