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


100

У мене є таблиця Named, 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> 2013-01-03 AND From_date <2013-01-09. ?
jpulikkottil

Відповіді:


144

опис інтервалу перетину

Як бачите, два способи зробити це можна двома способами:

  • зарахуйте всі прийнятні варіанти
  • виключити всі неправильні варіанти

Очевидно, що другий спосіб набагато простіший (лише два випадки проти чотирьох).

Ваш 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

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_Date або To_Date може бути між вашим діапазоном дат, або дати запису можуть охоплювати весь діапазон.

Якщо одна з From_dateабо To_dateперебуває між датами, або From_dateменша від дати початку і To_dateперевищує дату закінчення; тоді цей рядок слід повернути.


Відповідь сторінки (Y)
GreenROBO

Як повернути всі дані, якщо обидві дати введення є нульовими або порожніми? а також, якщо одна дата є недійсною або порожньою, слід отримати результат, виходячи з цих критеріїв
Світ кодування

40

Спробуйте виконати наступний запит, щоб отримати дати між діапазоном:

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

8
Це охоплює не всі можливості!
FallenAngel

@FallenAngel, чи можете ви мені пояснити, які не охоплені?
Баббло

4
Перевірте мою відповідь, будь ласка, ви не покривали продажі, які розпочалися раніше, start_dateале закінчилися між start_dateі end_date. З іншого боку, питання недостатньо зрозуміле, я думаю, у нас немає поняття, чи слід брати продажі, які суворо перебувають між датами чи датами, які частково включають діапазон дат, але можуть поширюватися на одну чи іншу сторону чи обох? Отже, основна проблема полягає в тому, що питання не ясне, я думаю.
FallenAngel

Я знаю, що ця публікація стара, але для тих, хто читає: Це не між датами, а включно з датами. Від і до.
Кен

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 - після закінчення: АБО (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

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'


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 tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

це відновить деталі, які перекриваються, щоб отримати деталі, що не перекриваються, а потім видаліть із запиту "НЕ"


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 серпня

Також додає випадок випадку для підтвердження запиту

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.