不应该返回T-SQL查询返回项目

时间:2009-10-01 20:58:34

标签: sql sql-server tsql sql-server-2000

这是场景。有问题的列称为'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'

返回相同的结果

5 个答案:

答案 0 :(得分:7)

缺点是千分之一秒的精度。请尝试“.997”。

MSDN DateTime documentation

运行此功能,您将看到:

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)

根据MSDN documentation

  

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''