19

在 SQL 中,我编写了一个SELECT语句来获取两个日期之间的数据,使用between and

前任:

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

但返回的行仅适用于第 26 行,而不是第 26 行和第 27 行。

你能帮助我吗?谢谢你。

4

6 回答 6

17

正如其他人回答的那样,您可能有一个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在博客上写过这个:和魔鬼有什么共同点?BETWEEN

于 2012-10-27T11:00:37.510 回答
13

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

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'.

于 2012-10-27T10:35:19.993 回答
4

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

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

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

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

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

于 2012-10-27T11:00:44.293 回答
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 被放在我们的生活中,以使我们免受这些问题的影响。

于 2015-09-09T18:46:38.837 回答
1

尝试这个:

select * 
from xxx 
where dates >= '2012-10-26 00:00:00.000' and dates <= '2012-10-27 23:59:59.997'
于 2012-10-27T10:41:41.500 回答
0

尝试使用以下查询

select * 
from xxx 
where convert(date,dates) >= '2012-10-26' and convert(date,dates) <= '2012-10-27'
于 2012-10-27T20:11:48.050 回答