首页 新闻 赞助 找找看

Sql日期范围问题

1
悬赏园豆:40 [已解决问题] 解决于 2011-12-05 16:51

最近项目经理说写查询语句要用以下第一种方式写,第二种方式会有误差,但是我搞不懂为什么第二种会有问题呢?

第一种方式:

SELECT COUNT(1) FROM dbo.AlarmOperation WHERE GpsTime >= '2011-11-1 00:00:00' AND GpsTime < '2011-11-19 00:00:00'

第二种方式

SELECT COUNT(1) FROM dbo.AlarmOperation WHERE GpsTime BETWEEN '2011-11-1 00:00:00' AND '2011-11-18 23:59:59'

supperwu的主页 supperwu | 初学一级 | 园豆:164
提问于:2011-11-21 10:14
< >
分享
最佳答案
0

我只针对Sql Server说吧

你的项目经理说的对,GpsTime 应该是 datetime 或者 smalldatetime 类型吧, 第二种方式等于

SELECT COUNT(1) FROM dbo.AlarmOperation WHERE GpsTime >= '2011-11-1 00:00:00' AND GpsTime <= '2011-11-18 23:59:59' 但是 2011-11-18 23:59:59 和 2011-11-19 00:00:00 之间相差一秒呢,这可是个不小的时间间隔, 如果GpsTime 是 datetime(看起来精度到毫秒) 那么这个之间的就漏掉了。

奇怪的是,这么多朋友不清楚,可想而知,平时的软件中会有多少bug了。

如果GpsTim确实是datetime或者smalldatetime,我喜欢这样写

Select .... where GpsTime >= '20111101' and GpsTime < '20111119'

收获园豆:25
ChatinCode | 老鸟四级 |园豆:2272 | 2011-11-22 15:56
其他回答(4)
0

第一个写法可以使用索引,between 。。and 无法使用索引;搜索会慢

Devin Mao | 园豆:596 (小虾三级) | 2011-11-21 10:26

看了执行计划,两个Sql语句的执行计划是一样的,都会用到索引。

支持(0) 反对(0) supperwu | 园豆:164 (初学一级) | 2011-11-21 10:43
0

误差?会不会有误差,取决于你的这两种写法的理解吧?

MSDN

写代码的小2B | 园豆:4371 (老鸟四级) | 2011-11-21 10:27
0

这个问题我碰到过。你们项目经理说得是对的。因为不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。有些是包括'2011-11-1 00:00:00'和'2011-11-18 23:59:59'的,有些则只取这两个时间之间的。

LCM | 园豆:6876 (大侠五级) | 2011-11-21 10:48

如果只针对MS Sql Server呢?会不会有误差?

支持(0) 反对(0) supperwu | 园豆:164 (初学一级) | 2011-11-21 11:00

@supperwu: 针对sqlserver不会有误差的。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2011-11-21 11:15

@supperwu: 他或许是想着以后万一要移植数据库,那就可能会出一些问题吧。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2011-11-21 11:16
0

如果写成  BETWEEN '2011-11-1 00:00:00 0000' AND '2011-11-18 23:59:59 9999'  就相差不大了,

收获园豆:15
dearz | 园豆:588 (小虾三级) | 2011-11-23 13:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册