[MYSQL] Alles ab Date-Time XY auslesen

bofh1337

Erfahrenes Mitglied
Ich sitze gerade vor einem kleinen Problem:

Ich habe in der DB Einträge mit einem "datetime"-Feld (zb. 2018-07-05 12:00:00). Jetzt will ich alles auslesen, was ab 5 Minuten in der Vergangenheit liegt, aber irgendo habe ich da einen Fehler in der Query:

$query->select('id')
->from('#__orw_carpool')
->where('time < DATE_ADD(DATE_FORMAT(NOW(), "%Y-%m-%d %H:%m:%s"), INTERVAL 5 MINUTE)');

Da wird entweder alles ausgelesen, oder nichts.
Wenn alles ausgelesen wird, dann sind da auch Einträge bei, die erst Morgen "ablaufen". Weiß da jemand weiter?
 
Lösung
Warum machst du aus einem Datum (NOW()) zuerst einen String (DATE_FORMAT()) um anschliessend eine Datumsfunktion (DATE_ADD()) darauf anzuwenden?
Zudem ist time ein unglücklicher Feldname, da es auch ein SQL-Befehl ist. Darum sollte er in ` stehen, damit klar ist, dass es ein Feldname ist.

Zudem willst du 5 Minuten zu NOW() abziehen und nicht dazurechnen.

SQL:
`time` < DATE_ADD(NOW(), INTERVAL -5 MINUTE)
-- oder
`time` < DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
-- oder
DATE_ADD(`time`, INTERVAL -5 MINUTE) < NOW()
Warum machst du aus einem Datum (NOW()) zuerst einen String (DATE_FORMAT()) um anschliessend eine Datumsfunktion (DATE_ADD()) darauf anzuwenden?
Zudem ist time ein unglücklicher Feldname, da es auch ein SQL-Befehl ist. Darum sollte er in ` stehen, damit klar ist, dass es ein Feldname ist.

Zudem willst du 5 Minuten zu NOW() abziehen und nicht dazurechnen.

SQL:
`time` < DATE_ADD(NOW(), INTERVAL -5 MINUTE)
-- oder
`time` < DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
-- oder
DATE_ADD(`time`, INTERVAL -5 MINUTE) < NOW()
 
Lösung
Warum machst du aus einem Datum (NOW()) zuerst einen String (DATE_FORMAT()) um anschliessend eine Datumsfunktion (DATE_ADD()) darauf anzuwenden?
Zudem ist time ein unglücklicher Feldname, da es auch ein SQL-Befehl ist. Darum sollte er in ` stehen, damit klar ist, dass es ein Feldname ist.

Zudem willst du 5 Minuten zu NOW() abziehen und nicht dazurechnen.

SQL:
`time` < DATE_ADD(NOW(), INTERVAL -5 MINUTE)
-- oder
`time` < DATE_SUB(NOW(), INTERVAL 5 MINUTE)
-- oder
DATE_ADD(`time`, INTERVAL -5 MINUTE) < NOW()


Danke dir, das scheint zu laufen :-)
Die Query sieht in Wirklichkeit so aus, ich habe hier nur die unwichtigen Sachen entfernt:

Code:
        $query->select($this->db->quoteName('id'))
            ->from($this->db->quoteName('#__orw_carpool'))
            ->where($this->db->quoteName('time') . ' < DATE_ADD(NOW(), INTERVAL -5 MINUTE)');

Wird also alles vom SQL-Layer escaped und gequotet ;-)
 
Zurück