SQL Server:在两个日期之间获取记录?

时间:2012-10-27 10:33:13

标签: sql-server datetime date-range

在SQL中,我使用SELECT

编写between and语句以在两个日期之间获取数据

例如:

select * 
from xxx 
where dates between '2012-10-26' and '2012-10-27'

但返回的行仅为第26行,而不是第26和第27行。

你能帮帮我吗?谢谢。

6 个答案:

答案 0 :(得分:14)

正如其他人已经回答的那样,您可能有DATETIME(或其他变体)列,而不是DATE数据类型。

这是适用于所有人的条件,包括DATE

SELECT * 
FROM xxx 
WHERE dates >= '20121026' 
  AND dates <  '20121028'    --- one day after 
                             --- it is converted to '2012-10-28 00:00:00.000'
 ;

@Aaron Bertrand已在以下网站发表过博文: What do BETWEEN and the devil have in common?

答案 1 :(得分:11)

您需要更明确,并添加开始和结束时间,直至毫秒:

select * 
from xxx 
where dates between '2012-10-26 00:00:00.000' and '2012-10-27 23:59:59.997'

数据库可以很好地将'2012-10-27'解释为'2012-10-27 00:00:00.000'

答案 2 :(得分:2)

你的问题没有问及如何正确使用BETWEEN,而是要求提供意外截断结果的帮助......

如上所述/在其他答案中暗示,问题是除日期外还有时间段。

根据我的经验,使用日期差异值得在键盘上额外磨损。它可以让你准确地表达你想要的东西,并且你被覆盖了。

select * 
from xxx 
where datediff(d, '2012-10-26', dates) >=0
and  datediff(d, dates,'2012-10-27') >=0

使用datediff,如果第一个日期在第二个日期之前,则会得到一个正数。有几种方法可以编写上面的内容,例如总是首先使用字段,然后是常量。只是翻转操作员。这是个人喜好的问题。

您可以通过删除一个或两个等号来明确表示您是想要包含还是排除端点。

BETWEEN将适用于您的情况,因为端点都被假定为午夜(即DATE)。 如果你的终点也是DATETIME,那么使用BETWEEN可能需要更多的投射。 在我看来,DATEDIFF被放在我们的生活中,以使我们免受这些问题的影响。

答案 3 :(得分:1)

试试这个:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'

答案 4 :(得分:1)

写这个的明确方法是(即将第二个日期增加1并使其成为<

select * 
from xxx 
where dates >= '20121026'
  and dates <  '20121028'

如果您使用的是SQL Server 2008或更高版本,则可以保留CAST作为DATE,同时保留SARGability,例如

select * 
from xxx 
where CAST(dates as DATE) between '20121026' and '20121027'

这明确告诉SQL Server您只对dates列的DATE部分感兴趣,以便与BETWEEN范围进行比较。

答案 5 :(得分:0)

尝试使用以下查询

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'