Wählen Sie Daten aus dem Datumsbereich zwischen zwei Daten aus


100

Ich habe eine Tabelle mit dem Namen Product_Salesund sie enthält Daten wie diese

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

Was ist nun die Abfrage, wenn ich Verkaufsdaten zwischen zwei Daten aus einem Datumsbereich auswählen möchte?

Zum Beispiel möchte ich Verkaufsdaten von 2013-01-03bis auswählen 2013-01-09.


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

Antworten:


144

Beschreibung der Intervallkreuzung

Wie Sie sehen, gibt es zwei Möglichkeiten, um Dinge zu erledigen:

  • Tragen Sie alle akzeptablen Optionen ein
  • alle falschen Optionen ausschließen

Offensichtlich ist der zweite Weg viel einfacher (nur zwei Fälle gegen vier).

Ihr SQL sieht folgendermaßen aus:

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

11
Ich möchte nur sagen, dass ich es liebe, dass Sie dies auf eine weiße Tafel gezeichnet haben, um die Antwort zu erklären. Du hast meinen Respekt und meine Bewunderung.
Ben Bynum

2
Ich weiß, dass dieses Problem ziemlich alt ist, aber wenn Sie diese WHERE NOTBedingung nicht verwenden möchten oder können, reicht es auch aus, die Operatoren umzudrehen und ein Gleiches hinzuzufügen: 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')

Sie müssen alle Möglichkeiten abdecken. From_Date oder To_Date können zwischen Ihrem Datumsbereich liegen oder die Aufnahmedaten können den gesamten Bereich abdecken.

Wenn eines von From_dateoder To_datezwischen den Daten liegt oder From_datekleiner als das Startdatum und To_dategrößer als das Enddatum ist; dann sollte diese Zeile zurückgegeben werden.


Antwort der Seite (Y)
GreenROBO

Wie kann ich alle Daten zurückgeben, wenn beide Eingabedaten null oder leer sind? und auch, wenn eines der Daten null oder leer ist, sollte das Ergebnis basierend auf diesen Kriterien erhalten werden
Codierungswelt

39

Versuchen Sie folgende Abfrage, um Daten zwischen dem Bereich zu erhalten:

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

8
Dies deckt nicht alle Möglichkeiten ab!
FallenAngel

@FallenAngel, kannst du mir bitte erklären, welche nicht abgedeckt sind?
Babblo

4
Überprüfen Sie bitte meine Antwort . Sie haben die Verkäufe, die zuvor begonnen haben, start_dateaber zwischen start_dateund endeten , nicht abgedeckt end_date. Auf der anderen Seite ist die Frage nicht klar genug, ich denke, wir haben keine Ahnung, ob wir Verkäufe tätigen sollten, die ausschließlich zwischen bestimmten Daten oder Daten liegen, die teilweise den Datumsbereich enthalten, sich aber auf der einen oder der anderen Seite oder auf beiden Seiten erstrecken können. Das Grundproblem besteht also darin, dass die Frage wohl nicht klar ist.
FallenAngel

Ich weiß, dass dieser Beitrag alt ist, aber für diejenigen, die lesen: Dies ist nicht zwischen Daten, sondern beinhaltet die Daten. Von und Bis.
Ken

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

Ihre Auswahl ist für das Beispiel From_date: 2012-12-30 to To_Date: 2013-01-05 falsch. Diese Daten liegen innerhalb des gewünschten Bereichs, werden jedoch in Ihrem SQL nicht zurückgegeben, da sie vor dem Bereich beginnen, aber innerhalb des Bereichs enden.
NetVicious

5

Dies umfasst alle Bedingungen, die Sie suchen.

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
Für eine inklusive Schnittmenge möchten Sie eine weitere OR-Klausel hinzufügen, die abgefangen werden soll, wenn das from_date vor dem Start und das to_date nach dem Ende liegt: OR (To_date <= '2013-08-19' AND From_date> = '2013-08- 23 ')
jhorback

3

Bitte versuche:

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

Nur meine 2 Cent finde ich die Verwendung des Formats "TT-MMM-JJJJ" am sichersten, da der Datenbankserver unabhängig von den regionalen Einstellungen auf dem Server weiß, was Sie wollen. Andernfalls können möglicherweise Probleme auf einem Server auftreten, dessen regionale Datumseinstellungen auf JJJJ-TT-MM festgelegt sind (aus welchen Gründen auch immer).

So:

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

Bei mir hat es immer gut funktioniert ;-)


3

Dies funktioniert unter 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

Diese Abfrage hilft Ihnen:

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

Überprüfen Sie diese Abfrage. Ich habe diese Abfrage erstellt, um zu überprüfen, ob das Eincheckdatum über die Runde mit Reservierungsdaten liegt

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

Dadurch werden die überlappenden Details erneut ausgeführt, um die nicht überlappenden Details zu erhalten. Entfernen Sie dann das 'NICHT' aus der Abfrage


1

Sie können auch versuchen, folgende Fragmente zu verwenden:

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

1

Dies ist einfach. Verwenden Sie diese Abfrage, um ausgewählte Daten aus dem Datumsbereich zwischen zwei Daten zu finden

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

0

Sie sollten Datumsangaben in SQL genauso vergleichen wie Zahlenwerte.

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

0

Hier finden Sie eine Abfrage, um alle Produktverkäufe zu finden, die im August ausgeführt wurden

  • Finden Sie Product_sales, die dort im August aktiv waren
  • Schließen Sie alles ein, was vor Ende August begonnen hat
  • Schließen Sie alles aus, was vor dem 1. August endete

Fügt außerdem eine case-Anweisung hinzu, um die Abfrage zu validieren

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

Dies ist einfach. Verwenden Sie diese Abfrage, um das zu finden, was Sie möchten.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.