2013-04-04 14 views
45

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

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 nichts zurück trotz der Daten zwischen diesen Zeiträumen. Muss ich die Werte in der 'von' und 'bis' Felder zu datetime in die Abfrage eingeben?

+0

Was ist der Datentyp für 'game_date'? – hjpotter92

+0

seine Datetime. Ich denke, ich habe herausgefunden, warum ich verwirrt war. Ich benutze * Krempel Software * für mysql und standardmäßig rendert es Datumsangaben in dem Format, das ich in meinem Datumsbereich verwendet habe, weshalb ich das gleiche verwendete. Das Problem war also das Format des Datums, das ich in meinem Angebot angegeben habe. – codingknob

+0

Wenn ich das Format von Eugen Rieck benutze, funktioniert es wie erwartet. – codingknob

Antwort

73

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; 
+1

Welches ist das Datum und welches ist der Monat hier? – Arun

+3

Das Format für ein Datumsliteral ist 'JJJJ-MM-TT HH: mm: SS' –

+1

Die Verwendung von BETWEEN ist NICHT die beste Methode, besonders da MySQL nun ** Unter-Sekunden-Zeitgenauigkeit ** unterstützt. Mit 23:59:59 ist eine volle Sekunde kurz vor dem Ende eines Tages. 'where game_date> = '2012-03-11' und game_date <'2012-05-12'' ist die präziseste Methode zum Definieren eines Datumsbereichs und funktioniert für jede Zeitgenauigkeit von Datum zu Sekunde. –

11

Hier ist eine einfache Art und Weise mit der Datums-Funktion:

select * 
from hockey_stats 
where date(game_date) between date('2012-11-03') and date('2012-11-05') 
order by game_date desc 
+4

Bin ich blind oder ist das ein Performance Killer? 'date (game_date)' lässt den Vergleich gegen einen ** calulcated-Wert ** laufen, nicht gegen ein Feld - was dazu führt, dass kein Index verwendet wird und jede einzelne Zeile berührt wird (d. h. vollständiger Tabellen-Scan)! –

+0

@EugenRieck. . . Sie haben im Allgemeinen recht, vorausgesetzt, es gibt einen Index für "Spieldatum". Auch ohne einen Index müsste die Tabelle für einen merklichen Unterschied in der Leistung moderat sein. Etwas über den Namen "hockey_stats" legt mir nahe, dass dies kein wirklich großer Tisch ist. –

4

Sie wahrscheinlich STR_TO_DATE Funktion verwenden müssen:

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 Spieldatum eine Zeichenfolge ist, müssen Sie möglicherweise STR_TO_DATE dafür verwenden)

3

Das MySQL-Datumsformat ist dies: Y-M-D. Sie verwenden Y/M/D. Das ist falsch. ändern Sie Ihre Abfrage.

Wenn Sie das Datum wie Y/M/D einfügen, wird Nullwert in die Datenbank eingefügt.

Wenn Sie PHP und Datum verwenden, die Sie aus dem Formular erhalten, ist dies Y/M/D, Sie können dies durch die Verwendung der Anweisung ersetzen.

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"]))) 
5

Eine einfache Art und Weise:

select * from hockey_stats 
where game_date >= '2012-03-11' and game_date <= '2012-05-11' 
1

Auf einfache Weise kann es als

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

Dies funktioniert abgefragt werden, wenn die Zeit nicht ein Anliegen ist.

In Anbetracht der Zeit folgen auch auf folgende Weise: wählen * von hockey_stats wo (Spiel_Datum zwischen '2018-02-05 01:20:00' und '2018-02-05 03:50:00'); Beachten Sie, dass dies für den MySQL-Server gilt.

0

Sie können entweder Benutzer STR_TO_DATE Funktion und Ihrem eigenen Datum Parameter übergeben basierend auf dem Format, das Sie gebucht haben:

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 benutzen Sie einfach das Format, die MySQL Daten YYYY behandelt: MM: DD HH: MM: SS und haben 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;

Verwandte Themen