|
廢話少說,直接上SQL代碼(有興趣的測試驗證一下),下面這個查詢語句為什么將2008-11-27的記錄查詢出來了呢?這個是同事遇到的一個問題,個人設(shè)計了一個例子。
USE AdventureWorks2014;GOSELECT * FROM [Person].[Person] WHERE ModifiedDate >= '2008-11-26 00:00:00:000' AND ModifiedDate <= '2008-11-26 23:59:59.999'
其實如果細(xì)看過文檔的話,應(yīng)該知道是什么原因,因為數(shù)據(jù)類型Datetiem的時間范圍:00:00:00 到 23:59:59.997 , 最后部分的范圍為0 ~997,官方文檔提示,datetime的秒的小數(shù)部分精度的有舍入,具體請見下面
datetime 秒的小數(shù)部分精度的舍入 如下表所示,將 datetime 值舍入到 .000、.003、或 .007 秒的增量 。
實驗測試驗證,998會轉(zhuǎn)換為997,而'2008-11-26 23:59:59.999'的話,就會轉(zhuǎn)換為'2008-11-27 00:00:00.000',如下截圖所示,所以尤其對數(shù)據(jù)精確性有要求的地方,要注意這些地方,否則SQL語句得出的結(jié)果在邏輯上就有誤。
官方文檔https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15 中也有描述不準(zhǔn)確的地方,如下截圖所示:
其實這個是精度問題,如果選擇datetime2數(shù)據(jù)類型,它默認(rèn)的小數(shù)精度更高,不會遇到這個問題,更多細(xì)節(jié)建議參考官方文檔(下面參考資料)
參考資料:
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 |
|
|