SQL Server中查詢結果超出了查詢時間范圍解決方法
廢話少說,直接上SQL代碼(有興趣的測試驗證一下),下面這個查詢語句為什么將2008-11-27的記錄查詢出來了呢?這個是同事遇到的一個問題,個人設計了一個例子。
USE AdventureWorks2014; GO SELECT * FROM [Person].[Person] WHERE ModifiedDate >= '2008-11-26 00:00:00:000' AND ModifiedDate <= '2008-11-26 23:59:59.999'
其實如果細看過文檔的話,應該知道是什么原因,因為數(shù)據(jù)類型Datetiem的時間范圍:00:00:00 到 23:59:59.997 , 最后部分的范圍為0 ~997,官方文檔提示,datetime的秒的小數(shù)部分精度的有舍入,具體請見下面
datetime 秒的小數(shù)部分精度的舍入
如下表所示,將 datetime 值舍入到 .000、.003、或 .007 秒的增量 。
用戶指定的值
系統(tǒng)存儲的值
01/01/98 23:59:59.999
1998-01-02 00:00:00.000
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
1998-01-01 23:59:59.997
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',如下截圖所示,所以尤其對數(shù)據(jù)精確性有要求的地方,要注意這些地方,否則SQL語句得出的結果在邏輯上就有誤。
官方文檔https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15 中也有描述不準確的地方,如下截圖所示:
其實這個是精度問題,如果選擇datetime2數(shù)據(jù)類型,它默認的小數(shù)精度更高,不會遇到這個問題,更多細節(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
以上就是本次介紹的關于SQL Server查詢超時的知識點內容,感謝大家的而學習和對腳本之家的支持。
相關文章
sqlserverdriver配置方法 jdbc連接sqlserver
這篇文章主要介紹了sqlserverdriver配置方法,介紹了連接SqlServer2000 和連接SqlServer2005的方法,大家參考使用吧2014-01-01sqlserver存儲過程中SELECT 與 SET 對變量賦值的區(qū)別
SQLServer中對已經定義的變量賦值的方式用兩種,分別是 SET 和 SELECT。對于這兩種方式的區(qū)別,SQL Server 聯(lián)機叢書中已經有詳細的說明,但很多時候我們并沒有注意,其實這兩種方式還是有很多差別的。2011-04-04sqlserver數(shù)據(jù)庫大型應用解決方案經驗總結
對于一個大型的互聯(lián)網應用,每天百萬級甚至上億的PV無疑對數(shù)據(jù)庫造成了相當高的負載。對于系統(tǒng)的穩(wěn)定性和擴展性造成了極大的問題2013-10-10SQL Server誤區(qū)30日談 第27天 使用BACKUP WITH CHECKSUM可以替代DBCC CheckDB
乍一看,由于BACKUP WITH CHECKSUM會檢測所有分配出去的頁的校驗和的值,這個誤區(qū)貌似是這么回事,但實際上并不是這么回事2013-01-01SQL2000個人版 應用程序正常初始化失敗0乘以C0000135失敗
應用程序正常初始化(0*c0000135)失敗。是什么意思?2011-01-01