Die folgende Abfrage:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
gibt nichts zurück.
Ich sollte mehr als genug Daten haben, damit die Abfrage funktioniert. Was mache ich falsch?
Die folgende Abfrage:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')
gibt nichts zurück.
Ich sollte mehr als genug Daten haben, damit die Abfrage funktioniert. Was mache ich falsch?
Antworten:
Ihr zweites Datum liegt vor Ihrem ersten Datum (dh Sie fragen zwischen dem 29. September 2010 und dem 30. Januar 2010 ab). Versuchen Sie, die Reihenfolge der Daten umzukehren:
SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
where
Klausel sollte für select
oder update
Anweisungen gleich funktionieren .
Ist date_field
vom Typdatetime
? Außerdem müssen Sie zuerst das Datum des Ohrhörers angeben.
Es sollte sein:
SELECT * FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
DATE () ist eine MySQL-Funktion, die nur den Datumsteil eines Datums- oder Datums- / Uhrzeitausdrucks extrahiert
SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
Als Erweiterung der Antwort von @sabin und als Hinweis, ob man das Datum vergleichen möchte nur teilweise (ohne Zeit):
Wenn das zu vergleichende Feld vom Typ datetime ist und nur Daten zum Vergleich angegeben werden, werden diese Daten intern in datetime- Werte konvertiert . Dies bedeutet, dass die folgende Abfrage
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')
wird konvertiert zu
SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')
im Inneren.
Dies führt wiederum zu einem Ergebnis, das die Objekte vom 29.09.2010 mit einem Zeitwert größer als 00:00:00 nicht enthält!
Wenn also auch alle Objekte mit dem Datum 2010-09-29 enthalten sein sollen, muss das zu vergleichende Feld in ein Datum konvertiert werden:
SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
Sie können dies manuell tun, indem Sie mit größer als oder gleich und kleiner als oder gleich vergleichen.
select * from table_name where created_at_column >= lower_date and created_at_column <= upper_date;
In unserem Beispiel müssen wir Daten von einem bestimmten Tag abrufen. Wir werden vom Beginn des Tages bis zur letzten Sekunde an einem anderen Tag vergleichen.
select * from table_name where created_at_column >= '2018-09-01 00:00:00' and created_at_column <= '2018-09-05 23:59:59';
Möglicherweise liegt ein Problem bei der Datumskonfiguration auf der Serverseite oder auf der Clientseite vor. Ich habe festgestellt, dass dies ein häufiges Problem bei mehreren Datenbanken ist, wenn der Host auf Spanisch, Französisch oder was auch immer konfiguriert ist. Dies kann sich auf das Format TT / MM / JJJJ oder MM / TT / JJJJ auswirken.
Wenn Sie Datums- und Uhrzeitwerte verwenden, müssen Sie die Felder als DateTime
und nicht umwandeln Date
. Versuchen :
SELECT * FROM `objects`
WHERE (CAST(date_field AS DATETIME)
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
min
als auchmax
Werte als im Bereich liegend angesehen werden, um nicht zweimal ein Datum zu verarbeiten, das entweder dermin
undmax
-Wert ist (Randfall). Zum Beispiel das Datum2010-09-29 00:00:00
wird zwischen2010-09-28 00:00:00
und2010-09-29 00:00:00
, UND AUCH zwischen2010-09-29 00:00:00
und2010-09-30 00:00:00