Sqlserver:datetime類型的精度(不確定性)問題


轉自http://www.xuebuyuan.com/212359.html

 

 

背景:近日進行大型數據表的遷移處理,遭遇創建 主鍵時 索引鍵值重復的錯誤。仔細檢查原始表,並未有任何問題。分析后發現是遷移數據的算法中,根據datetime類型的字段 使用 between and 逐漸獲取每日的數據記錄 進行遷移的。故而造成遷移后的表中出現重復記錄。

  where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-01 23:59:59:999'

  環境:sqlserver 2000

  微軟官方文檔:指明datetime類型的精度為 :千分之三秒(3.33毫秒、0.00333秒)。所有的datetime類型的值在顯示、處理時 有所調整。即會圓整到幾個特殊的毫秒個位值:0、3、7:如:(9、0、1) 會引起進0調整;(5、6、7、8)引起7調整;(2、3、4)引起3調整。

  分析:所以,如果使用了between and的where條件,就可能引起計算失誤。

  where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-01 23:59:59:999' 就相當於

  where datetime_field between '2010-11-01 00:00:00.000' and '2010-11-02 00:00:00:000' 這樣,具有'2010-11-02 00:00:00:000'值的記錄就會出現多次。

 

  解決:根據sqlserver的datetime圓整的特性,可以使用:

  where datetime_field between '00:00:00.000' and ' 23:59:59:998' 來表達一天內的時間范圍。記住: ' 23:59:59:999'已經是下一天了。

  或者,使用:

  where datetime_field >= '00:00:00.000' and datetime_field < '下一日 00:00:00.000' 來表達一天內的時間范圍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM