Sql 使用日期时间类型为Between的select语句不检索所有字段?
我面临一个奇怪的查询结果,我想问你为什么我要面对这个问题 我将一些日期时间数据存储到测试表中,如下所示:Sql 使用日期时间类型为Between的select语句不检索所有字段?,sql,sql-server,datetime,Sql,Sql Server,Datetime,我面临一个奇怪的查询结果,我想问你为什么我要面对这个问题 我将一些日期时间数据存储到测试表中,如下所示: creation_time ----------------------- 2010-07-10 00:01:43.000 2010-07-11 00:01:43.000 2010-07-12 00:01:43.000 create table TestTable(creation_time datetime); Insert into TestTable values('2010-07
creation_time
-----------------------
2010-07-10 00:01:43.000
2010-07-11 00:01:43.000
2010-07-12 00:01:43.000
create table TestTable(creation_time datetime);
Insert into TestTable values('2010-07-10 00:01:43.000');
Insert into TestTable values('2010-07-11 00:01:43.000');
Insert into TestTable values('2010-07-12 00:01:43.000');
此表的创建和填写如下所示:
creation_time
-----------------------
2010-07-10 00:01:43.000
2010-07-11 00:01:43.000
2010-07-12 00:01:43.000
create table TestTable(creation_time datetime);
Insert into TestTable values('2010-07-10 00:01:43.000');
Insert into TestTable values('2010-07-11 00:01:43.000');
Insert into TestTable values('2010-07-12 00:01:43.000');
执行此查询时,我只得到两行,而不是预期的三行:
SELECT * FROM TestTable
WHERE creation_time BETWEEN CONVERT(VARCHAR(10),'2010-07-10',111) -- remove time part
and CONVERT(VARCHAR(10),'2010-07-12',111) -- remove time part
或者如果我执行这个查询,同样的问题
SELECT * FROM TestTable
WHERE CONVERT(datetime,creation_time,111) BETWEEN CONVERT(VARCHAR(10),'2010-07-10',111) -- remove time part
and CONVERT(VARCHAR(10),'2010-07-12',111) -- remove time part
我的问题:
- 为什么最后一行('2010-07-12 00:01:43.000')没有出现在 即使我将日期范围设置为涵盖从2010-07-10到2010-07-12的所有日期,结果如何李>
- 我使用Sql server 2005 express edition和windows xp 32位
- 我试图不使用变通解决方案,例如增加日期范围以覆盖额外的一天,从而获得我想要的天数
谢谢。您还需要从创建时间中删除时间部分。只要使用相同的
CONVERT
即可
当前,您正在询问2010-07-12 00:01:43.000是否小于2010-07-12 00:00:00.000,这是错误的。您还需要从创建时间中删除时间部分。只要使用相同的
CONVERT
即可
当前,您正在询问2010-07-12 00:01:43.000是否小于2010-07-12 00:00:00.000,这是不正确的。它不显示日期,因为您删除了时间部分,这将使日期相当于
'2010-07-12 00:00:00.000'
,并且由于最后一行大于此值,因此它不会显示在查询结果中。它不会显示日期,因为您已删除了时间部分,这将使日期相当于'2010-07-12 00:00:00.000'
,并且由于最后一行大于此值,因此它不会显示在查询结果中。您的脚本应该如下所示:
SELECT *
FROM TestTable
WHERE creation_time BETWEEN
convert(datetime, convert(char, '2010-07-10', 106))-- remove time part
and **DATEADD**(day, 1, convert(datetime, convert(char, '2010-07-**11**', 106))) -- remove time part and add 1 day
此脚本将在2010-07-10 00:00:00和2010-07-12 00:00:00之间返回所有。基本上这意味着在两天内创建的所有项目:2010-07-10和2010-07-11。您的脚本应该如下所示:
SELECT *
FROM TestTable
WHERE creation_time BETWEEN
convert(datetime, convert(char, '2010-07-10', 106))-- remove time part
and **DATEADD**(day, 1, convert(datetime, convert(char, '2010-07-**11**', 106))) -- remove time part and add 1 day
此脚本将在2010-07-10 00:00:00和2010-07-12 00:00:00之间返回所有。基本上,这意味着在两天内创建的所有项目:2010-07-10和2010-07-11。转换表中的列以进行比较可能成本高昂,并导致不使用索引。如果您的表中有一百万行,并且在创建时有一个索引,那么您将执行索引扫描,并将所有一百万个值转换为字符串进行比较 我发现最好使用>=开始日期和<(结束日期+1天):
转换表中的列进行比较可能代价高昂,并导致不使用索引。如果您的表中有一百万行,并且在创建时有一个索引,那么您将执行索引扫描,并将所有一百万个值转换为字符串进行比较 我发现最好使用>=开始日期和<(结束日期+1天):
日期/时间(包括2010年10月7日至2010年12月7日):
SELECT * FROM TestTable
WHERE creation_time BETWEEN
CONVERT(VARCHAR,'2010-07-10',101) -- remove time part
and CONVERT(VARCHAR,'2010-07-13',101) -- remove time part
日期/时间(包括2010年10月7日至2010年12月7日):
SELECT * FROM TestTable
WHERE creation_time BETWEEN
CONVERT(VARCHAR,'2010-07-10',101) -- remove time part
and CONVERT(VARCHAR,'2010-07-13',101) -- remove time part
我做了,但没有结果?我将更新我的问题以提及这一点。thanksI找到了一个删除时间部分的方法:,谢谢matti,谢谢你们,我会选择这个答案,因为这是第一个有用的答案。我这么做了,但没有结果?我将更新我的问题以提及这一点。thanksI找到了删除时间部分的方法:,谢谢matti,谢谢你们,我会选择这个答案,因为这是第一个有用的答案。