Art*_*yan 15 sql-server datetime datetime2 sql-server-2016
我知道隐式类型转换不是一个好习惯。但当较低的值突然变得较高时,这确实是意想不到的行为。
declare @LastSelectedDate DATETIME = '2021-11-09 13:52:29.187'
declare @LastSelectedDate_1 DATETIME2(7) = '2021-11-09 13:52:29.1866667'
SELECT IIF(@LastSelectedDate_1 > CAST(@LastSelectedDate AS DATETIME2), 1, 0)
SELECT IIF(@LastSelectedDate_1 > @LastSelectedDate, 1, 0)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我遗漏了什么?我正在使用 SQL Server 2016。
Mar*_*ith 19
是的,我不知道为什么他们认为这种行为是个好主意。
但这是“设计使然”而不是错误
受兼容性级别保护的重大更改的一个示例是从 datetime 到 datetime2 数据类型的隐式转换。在数据库兼容性级别 130 下,这些结果通过考虑小数毫秒来提高准确性,从而产生不同的转换值。要恢复以前的转换行为,请将数据库兼容级别设置为 120 或更低。
具体来说datetime
,结束3
被视为3
重复出现,datetime
结束7
被视为6
重复出现。datetime
那一端0
不受影响。(这些是该数据类型的唯一可能性,因为它每秒有 300 个“刻度”)
限制兼容性级别来解决这个单一问题似乎是一个大锤解决方案。您可以显式地将其强制转换为datetime2(3)
以避免这种情况
DECLARE @LastSelectedDate DATETIME = '2021-11-09 13:52:29.187'
SELECT CAST(@LastSelectedDate AS DATETIME2(7)),
CAST(CAST(@LastSelectedDate AS DATETIME2(3)) AS DATETIME2(7))
Run Code Online (Sandbox Code Playgroud)
退货
+-----------------------------+-----------------------------+
| 2021-11-09 13:52:29.1866667 | 2021-11-09 13:52:29.1870000 |
+-----------------------------+-----------------------------+
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2469 次 |
最近记录: |