Выберите данные из диапазона дат между двумя датами


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-03по 2013-01-09.


To_date> 03.01.2013 И From_date <2013-01-09. ?
jpulikkottil

Ответы:


145

описание пересечения интервалов

Как видите, есть два способа добиться цели:

  • зачислить все приемлемые варианты
  • исключить все неправильные варианты

Очевидно, второй способ намного проще (всего два случая против четырех).

Ваш SQL будет выглядеть так:

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

13
Я просто хочу сказать, что мне нравится, что вы нарисовали это на белой доске, чтобы объяснить ответ. Вам мое уважение и мое восхищение.
Бен Байнум

3
Я знаю, что эта проблема довольно старая, но если вы не хотите или не можете использовать это WHERE NOTусловие, переключение операторов и добавление равного также выполняет свою работу: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück,

85
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_Date или To_Date могут находиться между вашим диапазоном дат или даты записи могут охватывать весь диапазон.

Если одна из From_dateили To_dateнаходится между датами, или From_dateменьше даты начала и To_dateбольше даты окончания; тогда эта строка должна быть возвращена.


Ответ страницы (Y)
GreenROBO 07

Как вернуть все данные, если обе даты ввода нулевые или пустые? а также, если одна из дат является нулевой или пустой, результат должен быть основан на этих критериях
Мир кодирования

40

Попробуйте выполнить следующий запрос, чтобы получить даты между диапазоном:

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

8
Это не охватывает все возможности!
FallenAngel

@FallenAngel, не могли бы вы объяснить мне, что не охвачено?
Babblo

4
Проверьте мой ответ , вы не охватили продажи, которые начались ранее, start_dateно закончились между start_dateи end_date. С другой стороны, вопрос недостаточно ясен, я думаю, мы не имеем ни малейшего понятия, должны ли мы принимать продажи, которые находятся строго между заданными датами или датами, которые частично включают диапазон дат, но могут распространяться на одну или другую сторону или на оба? Так что основная проблема в том, что вопрос не ясен.
FallenAngel

Я знаю, что этот пост старый, но для тех, кто читает: он не между датами, но включает даты. От и до.
Кен

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

Ваш выбор будет неправильным для примера From_date: 2012-12-30 to To_Date: 2013-01-05. Эти даты находятся внутри желаемого диапазона, но в вашем SQL не будут возвращены, потому что они начинаются перед диапазоном, но заканчиваются внутри диапазона.
NetVicious

5
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 08

5

Это покрывает все условия, которые вы ищете.

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

4

Пожалуйста попробуйте:

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'


2

Проверьте этот запрос, я создал этот запрос, чтобы проверить, совпадает ли дата заезда с датами бронирования.

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

это приведет к повторному запуску перекрывающихся деталей, чтобы получить неперекрывающиеся детали, а затем удалите «НЕ» из запроса.



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

Вы должны сравнивать даты в sql так же, как вы сравниваете числовые значения,

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

0

Вот запрос, чтобы найти все продажи продуктов, которые были запущены в течение августа.

  • Найдите Product_sales, которые были активны в течение августа
  • Включите все, что началось до конца августа
  • Исключить все, что закончилось до 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'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.