Wie subtrahiere ich Stunden von einer Datums- / Uhrzeitangabe in MySQL?

69

Ich erhalte ein Datum / Uhrzeit-Feld, das sich derzeit in der Abfrage befindet als:

SELECT DATE_FORMAT(x.date_entered, '%Y-%m-%d') AS date FROM x ORDER BY date ASC

Ich möchte 3 Stunden von diesem Datum abziehen (GMT-Probleme), aber ich kann es in PHP nicht tun, da PHP nur den Datumsteil kennt, nicht die Uhrzeit.

Lucas Famelli
quelle

Antworten:

123

mySQL hat DATE_SUB():

SELECT DATE_SUB(column, INTERVAL 3 HOUR)....

Aber wäre es nicht besser, stattdessen das zugrunde liegende Zeitzonenproblem zu lösen?

Pekka
quelle
Nun, die GMT ist nicht genau eine Sache, die ich ändern kann (verdammtes Vermächtnis), aber wie bekomme ich das in das Format, das ich brauche? %Y-%m-%d
Lucas Famelli
@Lucas Ich bin mir nicht sicher, warum du überhaupt eine machst DATE_FORMAT()- würde das DATE(x.date_entered)nicht schon tun? Die letzte Zeile wäreDATE(DATE_SUB(x.date_entered, INTERVAL 3 HOUR))
Pekka
Ich wollte das Datum in dem von mir gewünschten Format vorformatieren (JJJJ / MM / TT), war mir aber nicht sicher, wie ich es in PHP machen soll, also habe ich SQL verwendet.
Lucas Famelli
@ Lucas ah, fair genug. Wickeln Sie dann DATE_FORMAT um die DATE_SUBDirektive und es sollte funktionieren.
Pekka
Aber wie können wir die Stunden subtrahieren, damit wir bekommen können (Datum und Zeitstempel des heutigen Tages wie 23:00:00)
shzyincu
5

Angenommen, Sie haben ein Zeitzonenproblem und kennen die Zeitzone von Quelle und Ziel. Sie können es auch so konvertieren

SELECT DATE_FORMAT(CONVERT_TZ(x.date_entered, 'UTC', 'Europe/Berlin'),
                   '%Y-%m-%d') AS date
FROM x ORDER BY date ASC;
Webjunkie
quelle
1
Dies ist in vielen Fällen wahrscheinlich eine "richtige" Lösung, erfordert jedoch leider, dass die Zeitzonentabelle mit MySQL installiert wurde. Andernfalls erhalten Sie nur NULL. Ich gab ihm eine up-Abstimmung auf der Grundlage dieser spezifischen Zeitzone Fragen , bei denen es wäre die richtige Lösung sein. Beispielsweise haben Sie möglicherweise zwei Bereiche in unterschiedlichen Zeitzonen, und nur einer von ihnen verwendet die Sommerzeit, sodass sie manchmal 3 Stunden und manchmal 2 Stunden (oder 4) unterschiedlich sind.
UncaAlby