背景:近日进行数据表查询处理,遭遇摸个时间段数据无法查询错误。仔细检查查询条件,并未有任何问题。分析后发现查询条件中,根据datetime类型的字段使用 between and 逐渐获取每日的数据记录 进行检索。故而导致查询结果错误。
where dt_field between '2010-11-01 00:00:00' and '2010-11-01 23:59:59'
其结果中丢失值为 '2010-11-01 23:59:59.023' 内容。
可见,我忘记了毫秒的部分;
于是,把查询条件修改为:
where dt_field between '2010-11-01 00:00:00.000' and '2010-11-01 23:59:59.999'
其结果中多出值为 '2010-11-02 00:00:00.023' 内容。
郁闷,这是为什么呢???
微软官方文档:指明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' 来表达一天内的时间范围。