T-SQL查询返回的项目不应该(T-SQL Query Returning Items It Sho

2019-07-20 11:39发布

这里的情景。 有问题的列被称为“datein”,它的类型是“日期时间”。 我有三排的“2009-10-01 00:00:00.000”的值“datein”。 为什么这个查询返回上述行?

SELECT  *
FROM    t_call AS tc
WHERE   tc.datein >= '2009-09-30 00:00:00.000'
        AND tc.datein <= '2009-09-30 23:59:59.999'

运用

SELECT  *
FROM    t_call AS tc
WHERE   tc.datein BETWEEN '2009-09-30 00:00:00.000'
        AND '2009-09-30 23:59:59.999'

返回相同的结果

Answer 1:

这是在第二值的千分之一的精度不够。 尝试” 0.997" 来代替。

MSDN文档的DateTime

运行此,你会看到:

declare @dt datetime

select @dt = '2009-09-30 23:59:59.999'
select @dt


Answer 2:

该DATETIME精度是0.00333秒。 所以,你需要去“2009-09-30 23:59:59.998”,所以它不四舍五入到10月1日。

例如:

select '2009-09-30 23:59:59.994', 
  cast('2009-09-30 23:59:59.994' as datetime)
union all select '2009-09-30 23:59:59.995', 
  cast('2009-09-30 23:59:59.995' as datetime)
union all select '2009-09-30 23:59:59.996', 
  cast('2009-09-30 23:59:59.996' as datetime)
union all select '2009-09-30 23:59:59.997', 
  cast('2009-09-30 23:59:59.997' as datetime)
union all select '2009-09-30 23:59:59.998', 
  cast('2009-09-30 23:59:59.998' as datetime)
union all select '2009-09-30 23:59:59.999', 
  cast('2009-09-30 23:59:59.999' as datetime)

收益:

2009-09-30 23:59:59.994 2009-09-30 23:59:59.993
2009-09-30 23:59:59.995 2009-09-30 23:59:59.997
2009-09-30 23:59:59.996 2009-09-30 23:59:59.997
2009-09-30 23:59:59.997 2009-09-30 23:59:59.997
2009-09-30 23:59:59.998 2009-09-30 23:59:59.997
2009-09-30 23:59:59.999 2009-10-01 00:00:00.000


Answer 3:

什么是列类型? 如果它是一个日期时间,尽量铸造你与一个日期时间以及比较值; 如果您使用的列排序规则是什么等字符串(CHAR,NCHAR,VARCHAR,NVARCHAR)?



Answer 4:

根据MSDN文档

从1753年1月1日至9999年12月31日,日期和时间数据,以第二的三百分之一(相当于3.33毫秒或0.00333秒)的精度。 值被四舍五入为0.000,0.003,或0.007秒增量,如表中所示。

在该页面给出的示例,您必须结束你的查询与0.997,以获得您所期望的结果。



Answer 5:

写这些查询的安全方法如下:

SELECT  *
FROM    t_call AS tc
WHERE   tc.datein >= '2009-09-30T00:00:00.000'
        AND tc.datein < '2009-10-01T00:00:00.000''


文章来源: T-SQL Query Returning Items It Shouldn't Be