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

问题描述 投票:0回答:7

在 SQL 中,我编写了一个

SELECT
语句来获取两个日期之间的数据,使用
between and

例如:

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

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

你能帮我吗?谢谢你。

sql-server datetime date-range
7个回答
18
投票

正如其他人回答的那样,您可能有一个

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
和魔鬼有什么共同点?


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'


4
投票

明确的写法是(即将第二个日期加 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 范围进行比较。


2
投票

您的问题没有询问如何正确使用 BETWEEN ,而是寻求有关意外截断结果的帮助...

正如其他答案中提到/暗示的那样,问题是除了日期之外,您还有时间段。

根据我的经验,使用日期差异值得键盘上的额外磨损/撕裂。它可以让你准确地表达你想要的内容,并且你可以得到满足。

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

使用 datediff,如果第一个日期早于第二个日期,您将得到一个正数。有多种方法可以编写上面的内容,例如始终先写字段,然后写常量。只需翻转操作符即可。这是个人喜好的问题。

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

BETWEEN 适用于您的情况,因为端点都被假定为午夜(即日期)。 如果您的端点也是 DATETIME,则使用 BETWEEN 可能需要更多转换。 在我看来,DATEDIFF 被放入我们的生活中是为了使我们免受这些问题的影响。


1
投票

试试这个:

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

0
投票

尝试使用以下查询

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

0
投票

是的,它不会为您获取第二个日期。您可以通过在 OR 条件中添加第二个日期来解决此问题。

示例:

选择* 来自xxx 其中日期介于“2012-10-26”和“2012-10-27”之间或日期位于(“2012-10-26”,“2012-10-27”)

© www.soinside.com 2019 - 2024. All rights reserved.