您好,登錄后才能下訂單哦!
廢話少說(shuō),直接上SQL代碼(有興趣的測(cè)試驗(yàn)證一下),下面這個(gè)查詢語(yǔ)句為什么將2008-11-27的記錄查詢出來(lái)了呢?這個(gè)是同事遇到的一個(gè)問(wèn)題,個(gè)人設(shè)計(jì)了一個(gè)例子。
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í)如果細(xì)看過(guò)文檔的話,應(yīng)該知道是什么原因,因?yàn)閿?shù)據(jù)類型Datetiem的時(shí)間范圍:00:00:00 到 23:59:59.997 , 最后部分的范圍為0 ~997,官方文檔提示,datetime的秒的小數(shù)部分精度的有舍入,具體請(qǐng)見(jiàn)下面
datetime 秒的小數(shù)部分精度的舍入
如下表所示,將 datetime 值舍入到 .000、.003、或 .007 秒的增量 。
用戶指定的值
系統(tǒng)存儲(chǔ)的值
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
實(shí)驗(yàn)測(cè)試驗(yàn)證,998會(huì)轉(zhuǎn)換為997,而'2008-11-26 23:59:59.999'的話,就會(huì)轉(zhuǎn)換為'2008-11-27 00:00:00.000',如下截圖所示,所以尤其對(duì)數(shù)據(jù)精確性有要求的地方,要注意這些地方,否則SQL語(yǔ)句得出的結(jié)果在邏輯上就有誤。
官方文檔https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15 中也有描述不準(zhǔn)確的地方,如下截圖所示:
其實(shí)這個(gè)是精度問(wèn)題,如果選擇datetime2數(shù)據(jù)類型,它默認(rèn)的小數(shù)精度更高,不會(huì)遇到這個(gè)問(wèn)題,更多細(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
以上就是本次介紹的關(guān)于SQL Server查詢超時(shí)的知識(shí)點(diǎn)內(nèi)容,感謝大家的而學(xué)習(xí)和對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。