选择在两个日期之间的日期范围内的数据。

146

我有一个名为Product_Sales的表,它保存了如下数据:

产品ID 销售员 数量 开始日期 结束日期
3 12 7 2013-01-05 2013-01-07
6 22 14 2013-01-06 2013-01-10
8 11 9 2013-02-05 2013-02-11

现在,如果我想从日期范围中选择两个日期之间的销售数据,应该怎么查询呢?

例如,我想选择从2013-01-032013-01-09的销售数据。


1
To_date > 2013-01-03 AND From_date < 2013-01-09。 - jpulikkottil
19个回答

230

区间交集描述

如您所见,有两种方法可以完成任务:

  • 列举所有可接受的选项
  • 排除所有错误的选项

显然,第二种方法更简单(只有两种情况对抗四种情况)。

你的SQL将看起来像:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)

83
我只想说我很喜欢你用白板画图来解释答案。你拥有我的尊重和钦佩。 - Ben Bynum
8
我知道这个问题很旧了,但如果您不想或无法使用WHERE NOT条件,可以反转运算符并添加一个等号来完成工作: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom - Laurenz Glück
8
@LaurenzGlück,不是“OR”,应该是SELECT * FROM Product_sales WHERE From_date <= @RangeTill AND To_date >= @RangeFrom - andyf
请注意,如果To_date可以为空,并且您想包括尚未结束的记录,则需要执行以下操作:NOT (From_date > @RangeTill OR ISNULL(To_date, '12/31/9999') < @RangeFrom) - thecoolmacdude
这是该网站上最好的帖子之一。史诗级!谢谢。 - Freddy

131
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

您必须涵盖所有可能性。From_DateTo_Date可能在您的日期范围内,或记录日期可能覆盖整个范围。

如果From_dateTo_date之一介于日期之间,或From_date小于开始日期且To_date大于结束日期,则应返回此行。


如何在输入日期为空或null的情况下返回所有数据?同时,如果其中一个日期为空或null,则应根据该条件获取结果。 - Coding world

46

尝试使用以下查询以获取范围内的日期:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'

12
这并不能涵盖所有可能性! - FallenAngel
@FallenAngel,你能否解释一下哪些没有被涵盖到? - Babblo
4
请检查我的回答,请注意补充一下开始于start_date之前但在start_dateend_date之间结束的销售情况。 另一方面,我想问题本身可能不够清晰,我们不确定是否只考虑在给定日期范围内的销售额,还是包括部分覆盖日期范围但可能延伸到一侧或两侧的销售额?因此,基本问题在于问题本身不够清晰。 - FallenAngel
我知道这篇文章比较旧,但是对于那些正在阅读的人来说:这不是在日期之间,而是包括了这两个日期,从起始日期到截止日期。 - Ken

26
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'

你的选择对于以下示例是错误的:从日期:2012年12月30日到日期:2013年1月5日。这些日期在所需范围内,但在你的SQL中不会被返回,因为它们开始于范围之前,但结束于范围之内。 - NetVicious

12

这涵盖了您正在寻找的所有条件。

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')

2
这应该是正确的答案。您必须使用from_date与AND一起使用最新日期<=,并且to_date> =最早日期。通过进行一些布尔运算,所有情况都可以以这种方式处理,而且比上面的答案更简单。 - Nicholas Stommel

8
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)

1
为了包含交集,您需要添加一个OR子句来捕获当from_date在开始之前且to_date在结束之后的情况: OR ( To_date <= '2013-08-19' AND From_date >= '2013-08-23' ) - jhorback

6

这很简单,使用以下查询语句可以在两个日期之间查找选择数据

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')

6

请尝试以下方法:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)

4
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )

4

我的建议是使用“dd-MMM-yyyy”格式,因为数据库服务器会知道你想要什么日期格式,无论服务器的区域设置如何。否则,在服务器的日期区域设置为yyyy-dd-mm(出于任何原因)的情况下,您可能会遇到问题。

因此:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

这对我一直很有效果 ;-)



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接