Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用日期时间类型为Between的select语句不检索所有字段?_Sql_Sql Server_Datetime - Fatal编程技术网

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,谢谢你们,我会选择这个答案,因为这是第一个有用的答案。