最近项目经理说写查询语句要用以下第一种方式写,第二种方式会有误差,但是我搞不懂为什么第二种会有问题呢?
第一种方式:
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'
我只针对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'
第一个写法可以使用索引,between 。。and 无法使用索引;搜索会慢
看了执行计划,两个Sql语句的执行计划是一样的,都会用到索引。
这个问题我碰到过。你们项目经理说得是对的。因为不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。有些是包括'2011-11-1 00:00:00'和'2011-11-18 23:59:59'的,有些则只取这两个时间之间的。
如果只针对MS Sql Server呢?会不会有误差?
@supperwu: 针对sqlserver不会有误差的。
@supperwu: 他或许是想着以后万一要移植数据库,那就可能会出一些问题吧。
如果写成 BETWEEN '2011-11-1 00:00:00 0000' AND '2011-11-18 23:59:59 9999' 就相差不大了,