Sql-Server
datetime 和 datetime2 的比較不正確
我知道進行隱式類型轉換不是一個好習慣。但是,當較低的值突然變得更高時,這確實是出乎意料的行為。
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)
這是一個錯誤還是我錯過了什麼?我正在使用 sql server 2016。
是的,我不知道他們為什麼認為這種行為是個好主意。
儘管這是“設計使然”而不是錯誤
受兼容性級別保護的重大更改的一個範例是從 datetime 到 datetime2 數據類型的隱式轉換。在數據庫兼容級別 130 下,這些通過考慮小數毫秒顯示了更高的準確性,從而導致不同的轉換值。要恢復以前的轉換行為,請將 Database Compatibility Level 設置為 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))
退貨
+-----------------------------+-----------------------------+ | 2021-11-09 13:52:29.1866667 | 2021-11-09 13:52:29.1870000 | +-----------------------------+-----------------------------+