SQL Server解惑——爲何你的查詢結果超出了查詢時間範圍

原文: SQL Server解惑——爲何你的查詢結果超出了查詢時間範圍

廢話少說,直接上SQL代碼(有興趣的測試驗證一下),下面這個查詢語句爲何將2008-11-27的記錄查詢出來了呢?這個是同事遇到的一個問題,我的設計了一個例子。html

 

USE AdventureWorks2014;
GO
SELECTFROM [Person].[Person]
WHERE ModifiedDate >= '2008-11-26 00:00:00:000'
  AND ModifiedDate <= '2008-11-26 23:59:59.999'

 

 

clip_image001

 

其實若是細看過文檔的話,應該知道是什麼緣由,由於數據類型Datetiem的時間範圍:00:00:00 到 23:59:59.997 , 最後部分的範圍爲0 ~997,官方文檔提示,datetime的秒的小數部分精度的有舍入,具體請見下面sql

 

datetime 秒的小數部分精度的舍入app

以下表所示,將 datetime 值舍入到 .000、.00三、或 .007 秒的增量 。測試

用戶指定的值spa

系統存儲的值設計

01/01/98 23:59:59.999code

1998-01-02 00:00:00.000orm

01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998
server

1998-01-01 23:59:59.997htm

01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994

1998-01-01 23:59:59.993

01/01/98 23:59:59.990

01/01/98 23:59:59.991

1998-01-01 23:59:59.990

 

實驗測試驗證,998會轉換爲997,而'2008-11-26 23:59:59.999'的話,就會轉換爲'2008-11-27 00:00:00.000',以下截圖所示,因此尤爲對數據精確性有要求的地方,要注意這些地方,不然SQL語句得出的結果在邏輯上就有誤。

 

clip_image002

 

官方文檔https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15 中也有描述不許確的地方,以下截圖所示: 

clip_image003

 

 

其實這個是精度問題,若是選擇datetime2數據類型,它默認的小數精度更高,不會遇到這個問題,更多細節建議參考官方文檔(下面參考資料)

 

 

 

參考資料:

 

https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15

相關文章
相關標籤/搜索