Sqlserver:datetime类型的精度(不确定性)问题
背景:近日进行大型数据表的迁移处理,遭遇创建 主键时 索引键值重复的错误。仔细检查原始表,并未有任何问题。分析后发现是迁移数据的算法中,根据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' 来表达一天内的时间范围。