Sql-Server

datetime 和 datetime2 的比較不正確

  • November 9, 2021

我知道進行隱式類型轉換不是一個好習慣。但是,當較低的值突然變得更高時,這確實是出乎意料的行為。

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 |
+-----------------------------+-----------------------------+

引用自:https://dba.stackexchange.com/questions/302362