MySQL Abfrage für einen bestimmten Zeitraum

7

Ich habe die folgenden Tabellendaten:

%Vor%

Ich muss eine Abfrage ausführen, die alle Datensätze zurückgibt, die sich in einem bestimmten Datumsbereich befinden, zum Beispiel: gebe alle Datensätze zurück, die von 2013-09-04 to 2013-09-05

betroffen sind

es wäre wie

%Vor%

also sollte es die ersten 2 Datensätze zurückgeben. Ich habe die Abfrage mit BETWEEN versucht, aber es scheint, dass ich mehrere Fälle aufbauen muss - oder gibt es einen einfacheren Weg? Dankeschön

    
Fuxi 03.09.2013, 23:59
quelle

3 Antworten

12

Es ist erstaunlich, dass dies seit fast zwei Jahren niemand mehr bemerkt hat, aber die anderen Antworten sind alle falsch , weil sie den Fall nicht berücksichtigten, wenn sowohl das Startdatum als auch das Enddatum überschritten wurden der Umfang des Suchbereichs. Betrachten Sie dies als den Bereich des Datums:

%Vor%

Und das ist der Bereich unserer Suche:

%Vor%

Die Suche sollte uns ein positives Ergebnis geben, weil sie sich schneiden. Wenn Sie jedoch die anderen Antworten verwenden, erhalten Sie ein negatives Ergebnis, da weder start_date noch end_date zwischen start_search und end_search sind.

Um die Lösung zu erhalten, zeichnen wir alle 4 möglichen Modi der Schnittmenge:

%Vor% %Vor% %Vor% %Vor%

Sie können OR alle 4 möglichen Fälle, um die einfache Lösung zu erhalten:

%Vor%

Eine weniger einfache Lösung ist:

%Vor%

Versuchen Sie, es anhand der obigen Diagramme zu visualisieren.

Wenn wir versuchen, ein Muster aus den obigen 4 Diagrammen zu extrapolieren, können wir sehen, dass während eines Schnittpunkts end_date immer >= start_search ist und umgekehrt start_date immer <= end_search . In der Tat können wir, wenn wir weiter visualisieren, sehen, dass , wenn diese beiden Bedingungen gelten, wir keine Schnittmenge haben .

Als solche ist eine andere Lösung so einfach wie:

%Vor%

Und der Vorteil dieser Lösung ist, dass wir nur zwei Vergleiche benötigen. Vergleichen Sie dies mit dem Ansatz " OR everything", der von 2 bis zu 8 (3 & amp; plus; 3 & amp; plus; 2) Vergleiche erfordert. (Jeder between Aufruf besteht aus 3 Vergleichen .)

    
Pacerier 02.03.2015 04:59
quelle
7

Versuchen Sie es mit:

%Vor%     
Juan M 04.09.2013 02:08
quelle
2

Dies sollte funktionieren

%Vor%

** Stellen Sie sicher, dass das Datum in mysql default formate (JJJJ-MM-ff hh: mm: ss)

ist     
Andrew Johnson 04.09.2013 00:04
quelle

Tags und Links