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

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'
jkmurphy1
источник
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'
)
Kiran K
источник
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)
TechDo
источник
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'

У меня это всегда хорошо работало ;-)

KDT
источник
3

Это работает на SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'
I_Valchev
источник
3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
Гестеф
источник
2

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

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

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

anandd360
источник
2

Этот запрос поможет вам:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014
Ритеш Ядав
источник
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'
rashedcs
источник
1

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

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')
F5 приятель
источник
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; 
jspooner
источник
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'
Абдиразак
источник