Wählen Sie Daten zwischen einem Datums- / Zeitbereich aus

83

Wie wähle ich Daten zwischen einem Datumsbereich in MySQL aus? Meine datetimeKolumne ist im 24-Stunden-Zulu-Zeitformat.

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

Gibt trotz Daten zwischen diesen Zeiträumen nichts zurück. Muss ich die Werte in den Feldern 'von' und 'bis' zwingen, datetimedie Abfrage einzugeben?

Codierknopf
quelle
Wofür ist der Datentyp game_date?
hjpotter92
1
seine datetime. Ich glaube, ich habe herausgefunden, warum ich verwirrt war. Ich verwende Toad-Software für MySQL und standardmäßig werden Datumsangaben in dem Format angezeigt, das ich in meinem Datumsbereich verwendet habe. Deshalb habe ich dasselbe verwendet. Das Problem war also das Format des Datums, das ich in meinem Sortiment angegeben habe.
Codierungsknopf
Wenn ich das von Eugen Rieck bereitgestellte Format verwende, funktioniert es wie erwartet.
Codierungsknopf

Antworten:

143

Sie müssen das Datumsformat aktualisieren:

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;
Eugen Rieck
quelle
2
Welches ist das Datum und welches ist der Monat hier?
Arun
8
Das Format für ein Datumsliteral ist 'JJJJ-MM-TT HH: mm: SS'
Eugen Rieck
13
Die Verwendung von ZWISCHEN ist KEINE bewährte Methode, zumal MySQL jetzt eine Genauigkeit von weniger als einer Sekunde unterstützt . Die Verwendung von 23:59:59 ist eine volle Sekunde vor dem Ende eines Tages. where game_date >= '2012-03-11' and game_date < '2012-05-12'ist die genaueste Methode zum Definieren eines Datumsbereichs und funktioniert für jede Zeitgenauigkeit von Datum bis zu Einheiten im Subsekundenbereich.
Used_By_Already
3
@Used_By_Already Als dies 2013 beantwortet wurde, gab es kein Sub-Sekunden-MySQL - und ich habe noch nichts von einem Hockeyspiel gehört, das zwischen 23:59 und 00:00 mit einer Startzeit von weniger als einer Sekunde beginnt.
Eugen Rieck
5
Für Leser, die MySQL-Versionen mit einer Genauigkeit von weniger als einer Sekunde verwenden, habe ich diesen Kommentar hinterlassen. MySQL Version 5.6.4 oder höher unterstützt Sekundenbruchteile. (Unabhängig davon, für welche Sportart oder welchen Zweck der Datumsbereich bestimmt ist.)
Used_By_Already
19

Hier ist eine einfache Möglichkeit, die Datumsfunktion zu verwenden:

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc
Gordon Linoff
quelle
7
Bin ich blind oder ist das ein Performance-Killer? date(game_date)Der Vergleich wird mit einem berechneten Wert und nicht mit einem Feld ausgeführt. Dies führt dazu , dass kein Index verwendet wird und jede einzelne Zeile berührt wird (dh ein vollständiger Tabellenscan).
Eugen Rieck
1
@ EugenRieck. . . Sie haben im Allgemeinen Recht, vorausgesetzt, es gibt einen Index für game_date. Auch ohne Index müsste die Tabelle für einen spürbaren Leistungsunterschied mäßig groß sein. Etwas an dem Namen hockey_statsdeutet darauf hin, dass dies kein wirklich großer Tisch ist.
Gordon Linoff
8

Ein einfacher Weg:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'
Hautausschläge
quelle
5

Sie müssen wahrscheinlich die Funktion STR_TO_DATE verwenden:

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(Wenn game_date eine Zeichenfolge ist, müssen Sie möglicherweise STR_TO_DATE verwenden.)

fthiella
quelle
4

Das MySQL-Datumsformat lautet wie folgt: YMD. Sie verwenden J / M / D. Das ist falsch Ändern Sie Ihre Abfrage.

Wenn Sie das Datum wie J / M / T einfügen, wird ein Nullwert in die Datenbank eingefügt.

Wenn Sie PHP verwenden und das Datum, das Sie aus dem Formular erhalten, wie folgt lautet: J / M / D, können Sie dies durch die Verwendung der Anweisung ersetzen.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))
Hafiz Shehbaz Ali
quelle
4

Auf einfache Weise kann es als abgefragt werden

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

Dies funktioniert, wenn die Zeit keine Rolle spielt.

In Anbetracht der Zeit folgen Sie auch folgendermaßen:

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

Beachten Sie, dass dies für den MySQL-Server gilt.

Mithun Theertha
quelle
2

Sie können entweder die Funktion STR_TO_DATE verwenden und Ihre eigenen Datumsparameter basierend auf dem von Ihnen veröffentlichten Format übergeben:

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

Oder verwenden Sie einfach das Format, in dem MySQL Datumsangaben verarbeitet. JJJJ: MM: TT HH: mm: SS und haben Sie die Abfrage als

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;

stackFan
quelle
2

Sie müssen das Datum verteidigen, um zu bestimmen, wie Sie diese game_date-Daten in Ihre Datenbank einfügen. Wenn Sie beispielsweise einen Datumswert für ein langes oder ein kurzes Datum eingegeben haben.

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

Sie können auch ZWISCHEN :

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

so einfach ist das.

Sturz
quelle
Ich versuche es genauso, aber es funktioniert nicht richtig und es werden zufällige datumsbezogene Daten abgerufen.
Manjeet Kumar Nai