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

T-SQL查询返回不应该返回的项,sql,sql-server,tsql,sql-server-2000,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' 返回相同的结果列类型是什么?如果是d

下面是一个场景。所讨论的列称为“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'

返回相同的结果

列类型是什么?如果是datetime,请尝试将您要比较的值也转换为datetime;如果是字符串char、nchar、varchar、nvarchar,那么您对列使用的排序规则是什么?

这是因为缺少千分之一秒的精度。试试.997

运行此命令,您将看到:

declare @dt datetime

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

1月1日起的日期和时间数据, 1753年至1999年12月31日 准确度为1/300 a 第二个相当于3.33 毫秒或0.00333秒。 值四舍五入为的增量 .000、.003或.007秒,如图所示 在桌子上

根据该页面中的给定示例,您必须以.997结束查询,以获得预期的结果。

时间为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

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

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

列类型为“datetime”。我将把它添加到op@GregD当前位置同样缺乏决心。DateTime仅适用于每3或4毫秒一次。太棒了。我已把你的答案标为正确答案。另外,非常感谢你的链接@乔尔谢谢你提供的额外信息。@Austin不理会我后来删除的评论。我将其转换为smalldatetime而不是datetime。SQL Server 2008的DATETIME2日期类型将精确到100ns,因此DATETIME2不会出现此问题
SELECT  *
FROM    t_call AS tc
WHERE   tc.datein >= '2009-09-30T00:00:00.000'
        AND tc.datein < '2009-10-01T00:00:00.000''