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.

Ronjon
źródło
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)
Dmitry Lukichev
źródło
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.

Upadły anioł
źródło
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'
jkmurphy1
źródło
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'
Berkay Turancı
źródło
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')
Avinash
źródło
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'
)
Kiran K.
źródło
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)
TechDo
źródło
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 ;-)

KDT
źródł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'
I_Valchev
źródło
3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )
Gestef
źródło
2

To zapytanie pomoże ci:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014
Ritesh Yadav
źródło
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)  
                   )  
                ) 
         )
zafarsiddiqui
źródło
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

anandd360
źródło
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'
zrazy
źródło
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')
F5 Buddy
źródło
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'
Adeel Ahmed
źródło
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; 
jspooner
źródło
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))
Kod
źródło
-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'
Abdirazack
źródło