轉自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' 來表達一天內的時間范圍。