[原] Sqlserver:datetime类型的精度(不确定性)问题

本文详细解析了在SQL Server中使用datetime类型字段进行查询时遇到的问题,特别是使用between and进行日期时间范围查询时可能出现的数据遗漏及重复问题,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:近日进行数据表查询处理,遭遇摸个时间段数据无法查询错误。仔细检查查询条件,并未有任何问题。分析后发现查询条件中,根据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' 来表达一天内的时间范围。

转载于:https://www.cnblogs.com/naran/archive/2012/07/24/2607400.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值