这里的情景。 有问题的列被称为“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'
返回相同的结果
这是在第二值的千分之一的精度不够。 尝试” 0.997" 来代替。
MSDN文档的DateTime
运行此,你会看到:
declare @dt datetime
select @dt = '2009-09-30 23:59:59.999'
select @dt
该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
什么是列类型? 如果它是一个日期时间,尽量铸造你与一个日期时间以及比较值; 如果您使用的列排序规则是什么等字符串(CHAR,NCHAR,VARCHAR,NVARCHAR)?
根据MSDN文档
从1753年1月1日至9999年12月31日,日期和时间数据,以第二的三百分之一(相当于3.33毫秒或0.00333秒)的精度。 值被四舍五入为0.000,0.003,或0.007秒增量,如表中所示。
在该页面给出的示例,您必须结束你的查询与0.997,以获得您所期望的结果。
写这些查询的安全方法如下:
SELECT *
FROM t_call AS tc
WHERE tc.datein >= '2009-09-30T00:00:00.000'
AND tc.datein < '2009-10-01T00:00:00.000''