这是场景。有问题的列称为'datein',它的类型是'datetime'。对于'datein',我有三行,值为'2009-10-01 00:00:00.000'。为什么此查询返回上述行?
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 :(得分:7)
缺点是千分之一秒的精度。请尝试“.997”。
运行此功能,您将看到:
declare @dt datetime
select @dt = '2009-09-30 23:59:59.999'
select @dt
答案 1 :(得分:3)
DATETIME accuracy为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
答案 2 :(得分:0)
什么是列类型?如果是日期时间,请尝试将您要比较的值转换为日期时间;如果它是一个字符串(char,nchar,varchar,nvarchar),你使用哪种排序规则等等?
答案 3 :(得分:0)
1月1日的日期和时间数据, 1753年至9999年12月31日,到了 准确度为三百分之一 第二(相当于3.33 毫秒或0.00333秒)。 值四舍五入为增量 .000,.003或.007秒,如图所示 在表中。
从该页面中的给定示例中,您必须以.997结束查询以获得您期望的结果。
答案 4 :(得分:0)
编写这些查询的安全方法如下:
SELECT *
FROM t_call AS tc
WHERE tc.datein >= '2009-09-30T00:00:00.000'
AND tc.datein < '2009-10-01T00:00:00.000''