T-SQL查询返回不应该返回的项
下面是一个场景。所讨论的列称为“datein”,其类型为“datetime”。我有三行'datein'的值为'2009-10-01 00:00:00.000'。为什么这个查询返回前面提到的行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
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''