- 1 1. Was ist MySQL TIMESTAMP?
- 2 2. Grundlegende Verwendung von TIMESTAMP
- 3 3. Arbeiten mit TIMESTAMP und Zeitzonen
- 4 4. Das Jahr‑2038‑Problem und seine Auswirkungen
- 5 5. Praktische Anwendungsfälle für den TIMESTAMP‑Typ
- 6 6. Wichtige Hinweise zur Verwendung des TIMESTAMP‑Typs
- 7 7. Zusammenfassung und Empfehlungen
- 8 8. Häufig gestellte Fragen (FAQ)
- 8.1 Wie sollte ich zwischen TIMESTAMP und DATETIME wählen?
- 8.2 Ist es wahr, dass TIMESTAMP nach 2038 nicht verwendet werden kann?
- 8.3 Wie kann ich NULL-Werte in einer TIMESTAMP-Spalte zulassen?
- 8.4 Wenn ich die Zeitzoneneinstellung ändere, wirkt sich das auf bestehende TIMESTAMP-Daten aus?
- 8.5 Wenn ich CURRENT_TIMESTAMP verwende, kann ich immer noch ein spezifisches Datum einfügen?
1. Was ist MySQL TIMESTAMP?
Der Datentyp TIMESTAMP in MySQL ist dafür ausgelegt, einen konkreten Zeitpunkt in UTC (Coordinated Universal Time) zu speichern und bei Speicherung und Abruf automatisch Zeitzonen‑Konvertierungen vorzunehmen. Dieser Datentyp kann Daten im Bereich vom 1. Januar 1970 bis zum 19. Januar 2038 verarbeiten. Beim Schreiben von Daten in die Datenbank verwendet TIMESTAMP die aktuelle Zeitzone, und beim Lesen wird er automatisch basierend auf der Systemzeitzone konvertiert.
Unterschiede zwischen TIMESTAMP und DATETIME
Der Datentyp DATETIME wird häufig mit TIMESTAMP verglichen. DATETIME speichert Datum‑ und Zeitwerte „wie sie sind“, sodass die gespeicherten Daten nicht von Zeitzonen beeinflusst werden. Im Gegensatz dazu wird TIMESTAMP beim Speichern in UTC umgewandelt und beim Abrufen wieder in die Systemzeitzone zurückkonvertiert, was Zeitverschiebungen zwischen verschiedenen Umgebungen verhindert.
Zum Beispiel ist TIMESTAMP besonders nützlich bei Systemmigrationen oder wenn mit Datenbanken in mehreren Zeitzonen gearbeitet wird. DATETIME unterstützt einen größeren Bereich – von Jahr 1000 bis 9999 – und wird daher häufig verwendet, um das Jahr‑2038‑Problem zu umgehen.
Beispielhafte Verwendung von TIMESTAMP
Sie können eine Tabelle mit TIMESTAMP wie folgt erstellen.
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
In diesem Beispiel speichert die Spalte event_time automatisch die aktuelle Zeit, wenn ein Datensatz eingefügt wird, und überschreibt diesen Wert bei jeder Aktualisierung des Datensatzes.
2. Grundlegende Verwendung von TIMESTAMP
Bei der Nutzung von TIMESTAMP in MySQL ist es wichtig, die grundlegenden Methoden zum Einfügen und Abrufen von Werten zu verstehen. Im Folgenden finden Sie mehrere gängige Vorgehensweisen für den Umgang mit TIMESTAMP‑Daten.
Ein Datum und eine Uhrzeit einfügen
Beim Einfügen von Daten in eine TIMESTAMP‑Spalte geben Sie typischerweise das Datum und die Uhrzeit als Zeichenkette an. Das Datum wird im Format „YYYY‑MM‑DD“ und die Uhrzeit im Format „hh:mm:ss“ dargestellt.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
Dieses SQL‑Statement fügt den 1. Oktober 2023 um 12:30:00 in die Spalte event_time ein.
Die aktuelle Zeit einfügen
Mit der MySQL‑Funktion NOW() können Sie ganz einfach das aktuelle Datum und die aktuelle Uhrzeit erhalten. Diese Funktion liefert das aktuelle Datum und die aktuelle Uhrzeit basierend auf der Systemzeitzone und kann direkt in eine TIMESTAMP‑Spalte eingefügt werden.
INSERT INTO events (event_time) VALUES (NOW());
In diesem Beispiel wird die zum Zeitpunkt der Ausführung des SQL‑Statements aktuelle Zeit automatisch eingefügt.
Die Auto‑Update‑Funktion nutzen
Wenn Sie für eine TIMESTAMP‑Spalte ON UPDATE CURRENT_TIMESTAMP angeben, wird die Aktualisierungszeit bei jeder Änderung des Datensatzes automatisch erfasst.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
In dieser Tabelle wird order_time beim Anlegen des Datensatzes auf die aktuelle Zeit gesetzt und bei jeder Aktualisierung des Datensatzes erneut aktualisiert. 
3. Arbeiten mit TIMESTAMP und Zeitzonen
Eine der größten Stärken von TIMESTAMP ist die Zeitzonen‑Verarbeitung. Gespeicherte Daten werden stets in UTC konvertiert, und beim Abruf aus der Datenbank werden sie erneut in die Systemzeitzone umgewandelt.
Wie man die Zeitzoneneinstellung prüft
In MySQL können Sie die Zeitzone server‑ oder sitzungsbezogen festlegen. Die aktuelle Zeitzoneneinstellung können Sie mit dem Befehl SHOW VARIABLES überprüfen.
SHOW VARIABLES LIKE 'time_zone';
Dieser Befehl gibt die derzeit für die Datenbank konfigurierte Zeitzone zurück. Um die Zeitzone zu ändern, verwenden Sie das folgende Statement.
SET time_zone = '+09:00';
Zeitzonen‑Unterschiede zwischen TIMESTAMP und DATETIME
Der Typ DATETIME speichert Datum und Zeit, ohne Zeitzonen zu berücksichtigen, während der Typ TIMESTAMP beim Speichern in UTC umgewandelt wird. Daher ist TIMESTAMP in Umgebungen, in denen mehrere Zeitzonen gleichzeitig vorkommen, häufig die bessere Wahl.
4. Das Jahr‑2038‑Problem und seine Auswirkungen
Das Jahr‑2038‑Problem wird durch die Begrenzung des TIMESTAMP‑Typs auf 32‑Bit‑Systemen verursacht. Der TIMESTAMP‑Typ von MySQL basiert auf der Anzahl der Sekunden seit 00:00:00 UTC am 1. Januar 1970. Wenn er den 03:14:07 UTC am 19. Januar 2038 überschreitet, kommt es zu einem Überlauf dieses Wertes.
Wie man das Jahr‑2038‑Problem vermeidet
Um dieses Problem zu vermeiden, wird empfohlen, ein 64‑Bit‑System oder den weiterreichenden DATETIME‑Typ zu verwenden. DATETIME kann Datums‑ und Zeitwerte von Jahr 1000 bis 9999 verarbeiten und kann daher sicher über das Jahr 2038 hinaus eingesetzt werden.
Sie können dieses Problem auch vermeiden, indem Sie Ihr System aktualisieren. Da 64‑Bit‑Systeme keine Jahr‑2038‑Begrenzung haben, ist es wichtig, ein Upgrade Ihrer Datenbank und Anwendungen in Betracht zu ziehen.
5. Praktische Anwendungsfälle für den TIMESTAMP‑Typ
Der MySQL‑TIMESTAMP‑Typ wird nicht nur zum Speichern einfacher Datums‑ und Zeitwerte verwendet, sondern unterstützt auch eine Vielzahl praktischer Muster, wie das automatische Einfügen oder Aktualisieren der aktuellen Zeit. Hier sind einige gängige erweiterte Anwendungsfälle.
Automatisches Einfügen der aktuellen Zeit
Beim Definieren einer TIMESTAMP‑Spalte kann CURRENT_TIMESTAMP als Standardwert festgelegt werden, sodass das aktuelle Datum und die aktuelle Uhrzeit automatisch eingefügt werden, sobald ein neuer Datensatz erstellt wird. Zum Beispiel können Sie eine Tabelle erstellen, die automatisch den Zeitpunkt einer Bestellung erfasst, indem Sie Folgendes tun.
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Automatisches Aufzeichnen der Aktualisierungszeit
Durch Angabe von ON UPDATE CURRENT_TIMESTAMP wird die Aktualisierungszeit jedes Mal automatisch erfasst, wenn ein Datensatz aktualisiert wird. Das erleichtert die automatische Verwaltung der Aktualisierungshistorie.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Verwendung mehrerer TIMESTAMP‑Spalten
In MySQL können Sie mehrere TIMESTAMP‑Spalten in einer Tabelle einbinden, jedoch darf standardmäßig nur eine Spalte CURRENT_TIMESTAMP als Standardwert haben. Wenn Sie mehrere Zeitstempel automatisch verwalten möchten, setzen Sie die Werte für die anderen Spalten explizit oder verwenden Sie den DATETIME‑Typ.
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
6. Wichtige Hinweise zur Verwendung des TIMESTAMP‑Typs
Bei der Verwendung des TIMESTAMP‑Typs gibt es mehrere wichtige Besonderheiten zu beachten. Das Wissen darüber hilft, unerwartete Inkonsistenzen und Fehler zu vermeiden.
NULL‑Einschränkungen und Standardwerte
Standardmäßig wird auf TIMESTAMP‑Spalten die Einschränkung NOT NULL angewendet. Das bedeutet, wenn Sie NULL‑Werte zulassen möchten, müssen Sie explizit DEFAULT NULL angeben.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Sie können auch DEFAULT 0 angeben, um standardmäßig einen ungültigen Datums‑Zeit‑Wert 0000-00-00 00:00:00 zu setzen. Dies wird jedoch nicht empfohlen. Im strengen SQL‑Modus von MySQL kann dieser ungültige Datums‑Zeit‑Wert Fehler verursachen.
Das Problem mit 0000-00-00 00:00:00
Einige MySQL‑Versionen unterstützen 0000-00-00 00:00:00 als ungültigen Datums‑Zeit‑Wert, aber er kann in realen Systemen betriebliche Probleme verursachen. Insbesondere Systeme, die Datenintegrität priorisieren, sollten solche ungültigen Werte vermeiden. Stattdessen wird empfohlen, NULL oder einen geeigneten Standardwert zu verwenden.
CREATE TABLE sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP NULL
);
Auswirkungen der System‑Zeitzone
Da der TIMESTAMP‑Typ nach der Umwandlung in UTC gespeichert wird, sollten Sie bei der Migration von Datenbanken über verschiedene Zeitzonen hinweg vorsichtig sein. Ändert sich die Zeitzoneneinstellung des Servers, können die abgerufenen Zeiten unerwartete Werte annehmen. Es ist wichtig, Zeitzonen genau zu verwalten.
SET time_zone = 'Asia/Tokyo';
Dieser Befehl stellt die Datenbank-Zeitzone auf Tokio ein und gewährleistet eine genaue Verwaltung der Konvertierungen von UTC.

7. Zusammenfassung und Empfehlungen
Der TIMESTAMP-Typ ist ein mächtiges Werkzeug zur effizienten Verwaltung von Datum und Uhrzeit in MySQL. Insbesondere die automatische Konvertierung mit Zeitzonen und die automatische Zeitaufzeichnung bei Erstellen/Aktualisieren sind sehr bequem. Es ist jedoch wichtig, Einschränkungen und Fallstricke wie das Jahr-2038-Problem und die Handhabung von NULL-Werten zu verstehen.
Wann TIMESTAMP verwenden
- Wenn Sie Auto-Update-Verhalten benötigen , ist
TIMESTAMPideal – insbesondere wenn Sie einen Timestamp automatisch jedes Mal aufzeichnen möchten, wenn ein Datensatz aktualisiert wird. - In Systemen, die Zeitzonen berücksichtigen müssen , ist das auf UTC basierende Konvertierungsverhalten von
TIMESTAMPhilfreich. - Andererseits, wenn Sie einen zukunftssicheren Bereich benötigen oder Daten außerhalb des unterstützten Bereichs (nach 2038) handhaben müssen, erwägen Sie die Verwendung von
DATETIME.
Schließlich wählen Sie zwischen TIMESTAMP und DATETIME basierend auf Ihren Systemanforderungen, um Datenintegrität und Wartbarkeit zu gewährleisten.
8. Häufig gestellte Fragen (FAQ)
Fragen und Probleme im Zusammenhang mit MySQL TIMESTAMP sind unter Entwicklern üblich, daher fasst dieser Abschnitt häufig gestellte Fragen zusammen. Diese FAQs bieten hilfreiche Tipps und Lösungen für die korrekte Handhabung von TIMESTAMP.
Wie sollte ich zwischen TIMESTAMP und DATETIME wählen?
TIMESTAMP konvertiert Werte automatisch basierend auf Zeitzonen unter Verwendung von UTC, daher eignet es sich für Anwendungen und Systeme, die mehrere Zeitzonen berücksichtigen müssen. Es unterstützt auch das automatische Speichern von Datum/Uhrzeit-Werten, wenn Datensätze erstellt oder aktualisiert werden. Im Gegensatz dazu speichert DATETIME Werte „wie sie sind“, daher ist es besser, wenn Sie eine konsistente Datums-/Uhrzeit-Verwaltung ohne Zeitzonenkonvertierung benötigen.
Ist es wahr, dass TIMESTAMP nach 2038 nicht verwendet werden kann?
Ja. Das Jahr-2038-Problem betrifft den 32-Bit-TIMESTAMP-Typ. Da es auf der Anzahl der Sekunden seit dem 1. Januar 1970 basiert, kann es Datums-/Uhrzeit-Werte nach dem 19. Januar 2038 nicht darstellen. Um dies zu vermeiden, wird die Migration zu einem 64-Bit-System oder die Verwendung des DATETIME-Typs empfohlen.
Wie kann ich NULL-Werte in einer TIMESTAMP-Spalte zulassen?
Um NULL-Werte in einer TIMESTAMP-Spalte zuzulassen, müssen Sie explizit DEFAULT NULL angeben, wie unten gezeigt.
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
log_time TIMESTAMP DEFAULT NULL
);
Mit dieser Einstellung wird, wenn Sie einen Datensatz ohne Angabe eines Datums einfügen, ein NULL-Wert gespeichert.
Wenn ich die Zeitzoneneinstellung ändere, wirkt sich das auf bestehende TIMESTAMP-Daten aus?
Da TIMESTAMP-Werte beim Speichern in UTC konvertiert werden, beeinflusst die Änderung der Zeitzoneneinstellung, wie die Daten bei der Abfrage angezeigt werden. Die zugrunde liegenden Daten werden weiterhin in UTC gespeichert, aber sie werden basierend auf der neuen Zeitzone konvertiert, was die abgerufenen Zeitwerte ändert. Um die Daten konsistent zu halten, ist es wichtig, die Zeitzoneneinstellungen im gesamten System zu standardisieren.
Wenn ich CURRENT_TIMESTAMP verwende, kann ich immer noch ein spezifisches Datum einfügen?
CURRENT_TIMESTAMP fügt automatisch die aktuelle Zeit ein, wenn der Datensatz eingefügt wird, aber Sie können immer noch ein spezifisches Datum explizit einfügen, indem Sie NOW() oder einen String-Literal verwenden.
INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');
So können Sie Datums-/Uhrzeit-Werte manuell einfügen, auch wenn Sie CURRENT_TIMESTAMP verwenden.


