Wie frage ich mit MySQL zwischen zwei Daten ab?

225

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?

NullVoxPopuli
quelle
32
Seien Sie mit ZWISCHEN vorsichtig, da sowohl minals auch maxWerte als im Bereich liegend angesehen werden, um nicht zweimal ein Datum zu verarbeiten, das entweder der minund max-Wert ist (Randfall). Zum Beispiel das Datum 2010-09-29 00:00:00wird zwischen 2010-09-28 00:00:00und2010-09-29 00:00:00 , UND AUCH zwischen 2010-09-29 00:00:00und2010-09-30 00:00:00
minipif
ja, was er gesagt hat ^^
Albert Rannetsperger

Antworten:

471

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')
Daniel Vandersluis
quelle
Ich wusste das, habe aber jetzt ein Problem mit UPDATE. Ich versuche, ZWISCHEN UPDATE zu verwenden, sollte es genauso funktionieren?
Ingus
3
@IngusGraholskis: Eine whereKlausel sollte für selectoder updateAnweisungen gleich funktionieren .
T30
Persönlich finde ich den Begriff "von" und "bis" eine hinterhältige Möglichkeit, sich an die Reihenfolge zu erinnern, in der die Abfrage geschrieben werden soll.
KeaganFouche
Wie kann ich alle Daten zurückgeben, wenn beide Daten null oder leer sind?
Codierungswelt
23

Ihre Anfrage sollte das Datum als haben

select * from table between `lowerdate` and `upperdate`

Versuchen

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Nik
quelle
20

Ist date_fieldvom 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')
Rakete Hazmat
quelle
17

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';
sabin
quelle
Sie können eine Erklärung hinzufügen, damit die Leute verstehen, was Sie tun.
Franz Gleichmann
6

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')
ltlBeBoy
quelle
4

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';
Fahd Allebdi
quelle
1

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.

SoulWanderer
quelle
3
Das Problem war, dass das ältere Datum vor dem neueren Datum aufgeführt wurde.
theninjagreg
1

Wirf einfach date_field als Datum

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )
DS Mercy
quelle
1

Wenn Sie Datums- und Uhrzeitwerte verwenden, müssen Sie die Felder als DateTimeund 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))
Bruno Barral
quelle
0

Versuchen Sie, die Daten zu ändern:

2010-09-29 > 2010-01-30?
Jure1873
quelle