当前位置: 代码迷 >> Sql Server >> 【100分求解】sql关于时间的bug? 哪位高手能解释解释?
  详细解决方案

【100分求解】sql关于时间的bug? 哪位高手能解释解释?

热度:44   发布时间:2016-04-24 10:03:42.0
【100分求解】sql关于时间的bug?? 谁能解释解释???

/*
 *  tbl表BusDate字段的值都是yyyy-MM-dd 00:00:00格式
 */
-- 不能查出BusDate为‘2014-08-02 00:00:00’的数据
SELECT  *  FROM  tbl
 WHERE  BusDate   > '2014-08-01 23:59:59.999'
   
-- 可以查出BusDate为‘2014-08-02 00:00:00’的数据
SELECT  *  FROM  tbl
 WHERE  BusDate   > '2014-08-01 23:59:59.998'
/*
 *  为什么?
 */

------解决方案--------------------
不要动不动就说BUG,去查询下文档,时间的精度
------解决方案--------------------
试了一下,确实有这个问题,但不能就此就确定是bug:

select *
from 
(
select cast('2014-08-02 00:00:00' as datetime) d 
)t
WHERE  d   > cast('2014-08-01 23:59:59.998' as datetime)
/*
2014-08-02 00:00:00.000
*/


select *
from 
(
select cast('2014-08-02 00:00:00' as datetime) d 
)t
WHERE  d   > cast('2014-08-01 23:59:59.999' as datetime) 

------解决方案--------------------
通过进一步分析,发现如下,这就不难解释上述的问题了,显然这个不是bug:

select cast('2014-08-01 23:59:59.999' as datetime)
/*
2014-08-02 00:00:00.000
*/

select cast('2014-08-01 23:59:59.998' as datetime)
/*
2014-08-01 23:59:59.997
*/

------解决方案--------------------
进过进一步测试,发现当毫秒是如下这些的时候,会有四舍五入:

989,990,901 都是 900

992,993,994 都是 993

995,996,997,998 都是997
  相关解决方案