wake-up-neo.net

Wie frage ich mit MySQL zwischen zwei Daten ab?

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?

184
NullVoxPopuli

Ihr zweiter Termin liegt vor Ihrem ersten Termin (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')
383

Ihre Anfrage sollte Datum haben als 

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')
22
Nik

Ist date_field vom Typ datetime_? Sie müssen auch das frühere Datum zuerst eingeben.

Es sollte sein:

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

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';
11
sabin

Als Erweiterung zur Antwort von @sabin und als Hinweis, wenn nur der Teil date (ohne Zeitangabe) verglichen werden soll:

Wenn das zu vergleichende Feld vom Typ datetime ist und nur dates zum Vergleich angegeben werden, werden diese dates intern in datetime -Werte konvertiert. Dies bedeutet die folgende Abfrage

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

wird in konvertiert 

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 2010-09-29 nicht mit einem Zeitwert größer als 00:00:00 enthält!

Wenn also auch alle Objekte mit 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')
5
ltlBeBoy

Sie können dies manuell tun, indem Sie mit größer 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 den Beginn eines Tages mit der letzten Sekunde eines anderen Tages 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';
3
Fahd Allebdi

Könnte ein Problem mit der Datumskonfiguration auf der Serverseite oder auf der Clientseite sein .. __ Ich habe festgestellt, dass dies ein häufiges Problem in mehreren Datenbanken ist, wenn der Host auf Spanisch, Französisch oder was auch immer konfiguriert ist und das Format beeinflussen könnte tt/mm/jjjj oder mm/tt/jjjj.

1
SoulWanderer

Wenn Sie Datum und Time-Werte verwenden, müssen Sie die Felder als DateTime und nicht als Date..__ umwandeln. Versuchen Sie:

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))
1
Bruno Barral

Versuchen Sie, die Daten umzustellen:

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

Date_field einfach als Datum umsetzen 

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