Wybierz dane z zakresu dat między dwiema datami


100

Mam tabelę o nazwie, Product_Salesktóra zawiera takie dane

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

Jakie jest zapytanie, jeśli chcę wybrać dane sprzedaży między dwiema datami z zakresu dat?

Na przykład chcę wybrać dane dotyczące sprzedaży od 2013-01-03do 2013-01-09.


To_date> 2013-01-03 AND From_date <2013-01-09. ?
jpulikkottil

Odpowiedzi:


144

opis przecięcia przedziału

Jak widać, istnieją dwa sposoby na załatwienie sprawy:

  • podaj wszystkie dopuszczalne opcje
  • wykluczyć wszystkie złe opcje

Oczywiście drugi sposób jest znacznie prostszy (tylko dwa przypadki przeciwko czterem).

Twój SQL będzie wyglądał następująco:

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

13
Chcę tylko powiedzieć, że bardzo mi się podoba, że ​​narysowałeś to na białej tablicy, aby wyjaśnić odpowiedź. Masz mój szacunek i podziw.
Ben Bynum

3
Wiem, że ten problem jest dość stary, ale jeśli nie chcesz lub nie możesz użyć tego WHERE NOTwarunku, odwrócenie operatorów i dodanie równego sobie również działa: 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')

Musisz uwzględnić wszystkie możliwości. From_Date lub To_Date mogą znajdować się w zakresie dat lub daty rejestracji mogą obejmować cały zakres.

Jeśli jedna z dat From_datelub To_dateznajduje się między datami lub From_datejest wcześniejsza niż data rozpoczęcia i To_datewiększa niż data zakończenia; następnie należy zwrócić ten wiersz.


Odpowiedź strony (Y)
GreenROBO

Jak zwrócić wszystkie dane, jeśli obie daty wejściowe są puste lub puste? a także, jeśli jedna z dat jest pusta lub pusta, powinien otrzymać wynik na podstawie tych kryteriów
Kodowanie świata

40

Spróbuj wykonać następujące zapytanie, aby uzyskać daty z zakresu:

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

8
To nie obejmuje wszystkich możliwości!
FallenAngel

@FallenAngel, czy możesz mi wyjaśnić, które nie są objęte gwarancją?
Babblo

4
Proszę sprawdzić moją odpowiedź , nie obejmuje sprzedaży, która rozpoczęła się wcześniej, start_dateale zakończyła się między start_datea end_date. Z drugiej strony, pytanie nie jest wystarczająco jasne, myślę, że nie mamy pojęcia, czy powinniśmy przyjmować sprzedaż, która jest ściśle między podanymi datami, czy datami, które częściowo obejmują zakres dat, ale mogą rozciągać się po jednej lub drugiej stronie lub obu? Tak więc podstawowy problem polega na tym, że wydaje mi się, że pytanie nie jest jasne.
FallenAngel

Wiem, że ten post jest stary, ale dla tych, którzy czytają: To nie jest między datami, ale obejmuje daty. Od i do.
Ken

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

Twój wybór będzie nieprawidłowy dla przykładu From_date: 2012-12-30 to To_Date: 2013-01-05. Te daty znajdują się w żądanym zakresie, ale w kodzie SQL nie zostaną zwrócone, ponieważ zaczynają się przed zakresem, ale kończą się w zakresie.
NetVicious

5

Obejmuje wszystkie warunki, których szukasz.

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
W przypadku skrzyżowania włączającego będziesz chciał dodać jeszcze jedną klauzulę OR do przechwycenia, gdy data from_date jest przed początkiem, a data to_date znajduje się po zakończeniu: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

3

Proszę spróbować:

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

Tylko moje 2 centy, uważam, że używanie formatu „dd-MMM-yyyy” jest najbezpieczniejsze, ponieważ serwer db będzie wiedział, czego chcesz, niezależnie od ustawień regionalnych na serwerze. W przeciwnym razie możesz potencjalnie napotkać problemy na serwerze, który ma ustawienia regionalne z datą rrrr-dd-mm (z dowolnego powodu)

A zatem:

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

Zawsze mi się to udało ;-)


3

To działa na 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' )  )

2

To zapytanie pomoże ci:

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

Sprawdź to zapytanie, utworzyłem to zapytanie, aby sprawdzić, czy data zameldowania pokrywa się z jakimikolwiek datami rezerwacji

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

spowoduje to ponowne wykonanie nakładających się szczegółów, aby uzyskać nienakładające się szczegóły, a następnie usunąć „NIE” z zapytania


1

Możesz także spróbować użyć następujących fragmentów:

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

1

To proste. Użyj tego zapytania, aby znaleźć wybrane dane z zakresu dat między dwiema datami

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

0

Powinieneś porównywać daty w sql, tak jak porównujesz wartości liczbowe,

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

0

Oto zapytanie, które pozwala znaleźć wszystkie sprzedaże produktów w sierpniu

  • Znajdź Product_sales, które były aktywne w sierpniu
  • Uwzględnij wszystko, co zaczęło się przed końcem sierpnia
  • Wyklucz wszystko, co zakończyło się przed 1 sierpnia

Dodaje również instrukcję case, aby zweryfikować zapytanie

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

to proste, użyj tego zapytania, aby znaleźć to, czego szukasz.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.