MySQL Timestamp vs. Datetime

Will man ein Datum inklusive Uhrzeit in einer MySQL Datenbank abspeichern und hat die Dokumentation nicht genau gelesen, kann die Frage aufkommen, welcher der beiden Datentyp für die Anforderungen der richtige ist.
DATETIME oder TIMESTAMP? Die Antwort lautet: Es hängt von den genauen Bedürfnissen ab.

Schaut man in die offizielle MySQL-Dokumentation, findet man dort folgendes:

DATETIME - "Der Typ DATETIME wird bei Werten verwendet, die sowohl Datum- als auch Uhrzeitteile enthalten. MySQL ruft DATETIME-Werte im Format 'JJJJ-MM-TT HH:MM:SS' auf und zeigt sie an. Der unterstützte Bereich geht von '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'."

TIMESTAMP - "Der Typ TIMESTAMP wird bei Werten verwendet, die sowohl Datum- als auch Uhrzeitteile enthalten. TIMESTAMP hat einen Bereich von '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC."

Wie unterscheiden sich die beiden Datentypen nun?

Bis jetzt ist die Dokumentation hier nicht besonders aufschlussreich. Liest man jedoch weiter, kommt man zu folgendem Punkt:

"MySQL konvertiert TIMESTAMP-Werte zur Speicherung von der aktuellen Zeitzone in UTC und zum Abruf von UTC zurück in die aktuelle Zeitzone. (Dies tritt bei anderen Typen wie DATETIME nicht auf.)".

Wie wirkt sich dies auf die Implementierung aus und sollte ich jetzt DATETIME oder TIMESTAMP nutzen?

Nun, wie oben erwähnt, wird bei Verwendung des Datentyps TIMESTAMP der Wert von MySQL in UTC (Koordinierte Weltzeit) konvertiert und in dieser Zeitzone gespeichert.
Das bedeutet, dass beim Abrufen der Daten (SELECT) eine Konvertierung von UTC in die aktuelle Zeitzone erfolgt und der Wert erst dann zurückgegeben wird.
Beim Speichern und Abrufen von Werten im Typ DATETIME tritt dies nicht auf.

Praktisches Beispiel

Wenn du Benutzer in verschiedenen Zeitzonen mit unterschiedlichen Instanzen der selben Anwendung bedienen möchtest, kannst du mithilfe des Datentyps TIMESTAMP dieselben Datums- und Uhrzeitdaten in verschiedenen Zeitzonen bereitstellen ohne die Werte vor der Ausgabe selber konvertieren zu müssen.
Die von MySQL verwendete Zeitzone ist hier standardmäßig die Zeitzone des Servers. Selbstverständlich kann man die Zeitzone pro Verbindung festlegen. Bsp.: SET time_zone = '-2:00'; .

Beim Datentyp DATETIME ist der gespeicherte Wert in jeder Zeitzone gleich, wenn er aus der Datenbank abgerufen wird.
Er ist nicht von der Zeitzone abhängig.

Zusammenfassend lässt sich sagen: Wenn du deine Datums- und Uhrzeitdaten unabhängig von der Zeitzonen bereitstellen möchtest, verwende den Typ DATETIME. Andernfalls kannst du TIMESTAMP verwenden um die Daten abhängig von der Zeitzone bereitstellen.