从两个日期之间的日期范围中选择数据


100

我有一个名为的表Product_Sales,它包含这样的数据

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
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


To_date> 2013-01-03和From_date <2013-01-09。?
jpulikkottil

Answers:


144

区间交点描述

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

  • 征集所有可接受的选项
  • 排除所有错误的选项

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

您的SQL将如下所示:

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

13
我只想说我喜欢您将其画在白板上以解释答案。你有我的尊重和钦佩。
Ben Bynum

3
我知道这个问题已经很久了,但是如果您不希望或不能使用这种WHERE NOT情况,那么转而求操作符并添加一个均等值也可以完成此任务: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
LaurenzGlück

84
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大于结束日期;然后应返回此行。


页面答案(Y)
GreenROBO

如果两个输入日期均为null或为空,如何返回所有数据?并且,如果日期之一为null或为空,则应根据该条件获得结果
编码世界

40

尝试执行以下查询以获取介于范围之间的日期:

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

8
这并不涵盖所有可能性!
FallenAngel '16

@FallenAngel,您能解释一下哪些内容不包括在内吗?
巴勃罗

4
请检查我的回答,您没有涵盖start_datestart_date和之间开始但在之间结束的销售end_date。另一方面,我想这个问题还不够清楚,我们不知道我们是否应该严格执行在给定日期或部分包含日期范围的日期之间进行的销售,但可能会在一侧或另一侧或两者同时进行?因此,基本问题是我猜不清楚这个问题。
FallenAngel '16

我知道这篇文章很旧,但是对于那些阅读者来说:这不是在日期之间,而是包含日期。从和到。
肯(Ken)

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

对于示例From_date:2012-12-30至To_Date:2013-01-05,您的选择将是错误的。这些日期是在期望范围内,但在你的SQL,因为他们开始将不予退还之前的范围内,但它们完成内部的范围。
NetVicious

5

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

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

4
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
对于包含性交集,当from_date在开始之前,而to_date在结束之后时,您将需要添加一个OR子句以进行捕获:OR(To_date <='2013-08-19'AND From_date> ='2013-08- 23')
jhorback 2014年

3

请尝试:

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)

3

仅花费2美分,我发现使用“ dd-MMM-yyyy”格式最安全,因为db服务器将知道您想要的内容,而不管服务器上的区域设置如何。否则,您可能会在其日期区域设置为yyyy-dd-mm的服务器上遇到问题(无论出于何种原因)

从而:

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

这对我来说一直很好;-)


3

这适用于SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'

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


1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )

1

检查此查询,我创建此查询以检查是否有任何预订日期的入住日期超过一圈

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

这将重新运行重叠的详细信息,以获取不重叠的详细信息,然后从查询中删除“ NOT”


1

您也可以尝试使用以下片段:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'

1

这很容易,使用此查询从两个日期之间的日期范围中查找选择的数据

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


0

这是一个查询,以查找八月份的所有产品销售情况

  • 查找八月份活跃的Product_sales
  • 包括8月底之前开始的所有内容
  • 排除在8月1日之前结束的所有内容

还添加了一个case语句来验证查询

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 

0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))

-1

这很容易,使用此查询可以找到所需的内容。

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.