Arbeit mit Datum und Zeit
Für Datum und Zeit gibt es in MySQL mehrere Datentypen: DATE, TIME, DATETIME und TIMESTAMP.
Für Datum und Zeit gibt es in PostgreSQL mehrere Datentypen: DATE, TIME, TIMESTAMP, TIMESTAMPTZ und INTERVAL.
Unterschied zwischen TIMESTAMP und DATETIME
DATETIME und TIMESTAMP ähneln sich in MySQL stark, weil beide für Datum und Zeit gedacht sind. Es gibt aber einige wichtige Unterschiede, die entscheiden, welcher Typ wann besser passt.
DATETIME
Speichert Werte zwischen 1000-01-01 00:00:00 und 9999-12-31 23:59:59 und belegt dabei 8 Bytes. Dieser Datentyp hängt nicht von der in MySQL eingestellten Zeitzone ab. Er wird immer genau so angezeigt, wie er gesetzt wurde und in der Datenbank gespeichert ist. Das heißt: Ändert sich die Zeitzone, ändert sich die angezeigte Zeit nicht.
MySQL 8.1CREATE TABLE datetime_table (datetime_field DATETIME); SET @@session.time_zone="+00:00"; -- Zeitzone in MYSQL zurücksetzen INSERT INTO datetime_table VALUES("2022-06-16 16:37:23"); SET @@session.time_zone="+03:00"; -- Zeitzone in MYSQL ändern SELECT * FROM datetime_table;
TIMESTAMP
Speichert die Anzahl der Sekunden seit 1970-01-01 00:00:00 in der Zeitzone UTC und belegt dabei 4 Bytes. Bei der Abfrage wird der Wert unter Berücksichtigung der aktuellen Zeitzone angezeigt. Die Zeitzone kannst du in den Einstellungen des Betriebssystems, in den globalen MySQL-Einstellungen oder in einer konkreten Session festlegen. Beim Anlegen eines Datensatzes mit TIMESTAMP wird der Wert in der Datenbank in UTC abgelegt.
MySQL 8.1CREATE TABLE timestamp_table (timestamp_field TIMESTAMP); SET @@session.time_zone="+00:00"; -- Zeitzone in MYSQL zurücksetzen INSERT INTO timestamp_table VALUES("2022-06-16 16:37:23"); SET @@session.time_zone="+03:00"; -- Zeitzone in MYSQL ändern SELECT * FROM timestamp_table;
Vergiss auch nicht: TIMESTAMP ist auf den Wertebereich 1970-01-01 00:00:01 bis 2038-01-19 03:14:07 begrenzt, was seinen Einsatz einschränkt. Für die Speicherung von Geburtsdaten ist dieser Datentyp also nicht geeignet.
Unterschied zwischen TIMESTAMP und TIMESTAMPTZ
In PostgreSQL gibt es zwei Haupttypen für Datum und Zeit: TIMESTAMP (ohne Zeitzone) und TIMESTAMPTZ (mit Zeitzone).
TIMESTAMP
TIMESTAMP (bzw. TIMESTAMP WITHOUT TIME ZONE) speichert Datum und Zeit ohne Zeitzoneninformation. Das heißt: PostgreSQL weiß nicht, in welcher Zeitzone der Wert erfasst wurde, und führt keine Umrechnung durch.
MySQL 8.1CREATE TABLE timestamp_table (timestamp_field TIMESTAMP); SET timezone = 'UTC'; -- Zeitzone auf UTC setzen INSERT INTO timestamp_table VALUES('2022-06-16 16:37:23'); SET timezone = 'Europe/Moscow'; -- Zeitzone ändern SELECT * FROM timestamp_table;
Ergebnis: 2022-06-16 16:37:23 (der Wert hat sich nicht geändert)
TIMESTAMPTZ
TIMESTAMPTZ (bzw. TIMESTAMP WITH TIME ZONE) speichert Datum und Zeit zusammen mit der Zeitzoneninformation. PostgreSQL rechnet den Wert für die Speicherung automatisch in UTC um und bei der Ausgabe zurück in die lokale Zeitzone.
MySQL 8.1CREATE TABLE timestamptz_table (timestamptz_field TIMESTAMPTZ); SET timezone = 'UTC'; -- Zeitzone auf UTC setzen INSERT INTO timestamptz_table VALUES('2022-06-16 16:37:23'); SET timezone = 'Europe/Moscow'; -- Zeitzone auf Moscow (+3) ändern SELECT * FROM timestamptz_table;
Ergebnis: 2022-06-16 19:37:23+03 (die Zeit wurde automatisch umgerechnet)
INTERVAL
Der Typ INTERVAL wird für Zeiträume verwendet. Er kann Intervalle in Jahren, Monaten, Tagen, Stunden, Minuten und Sekunden ausdrücken.
MySQL 8.1SELECT '1 year 2 months 3 days 4 hours 5 minutes 6 seconds'::INTERVAL; SELECT '2 weeks'::INTERVAL; SELECT '90 minutes'::INTERVAL;
Schreibweise von Werten
Werte für DATETIME, DATE und TIMESTAMP kannst du auf folgende Arten angeben:
- Als String im Format YYYY-MM-DD HH:MM:SS oder YY-MM-DD HH:MM:SS für Datum und Zeit
- Als String im Format YYYY-MM-DD oder YY-MM-DD für nur das Datum
Beim Datum kannst du als Trennzeichen zwischen den Teilen praktisch jedes Satzzeichen verwenden. Auch ganz ohne Trennzeichen – also zusammenhängend – ist erlaubt.
MySQL 8.1CREATE TABLE date_table (datetime TIMESTAMP); INSERT INTO date_table VALUES("2022-06-16 16:37:23"); INSERT INTO date_table VALUES("22.05.31 8+15+04"); INSERT INTO date_table VALUES("2014/02/22 16*37*22"); INSERT INTO date_table VALUES("20220616163723"); INSERT INTO date_table VALUES("2021-02-12"); SELECT * FROM date_table;
Werte für Datums- und Zeittypen kannst du in verschiedenen Formaten angeben:
- Als String im ISO-8601-Format: 'YYYY-MM-DD HH:MM:SS'
- Als String mit Zeitzonenangabe: 'YYYY-MM-DD HH:MM:SS+TZ'
- Nur Datum: 'YYYY-MM-DD'
- Nur Zeit: 'HH:MM:SS'
MySQL 8.1CREATE TABLE date_table ( date_field DATE, time_field TIME, timestamp_field TIMESTAMP, timestamptz_field TIMESTAMPTZ ); INSERT INTO date_table VALUES( '2022-06-16', '16:37:23', '2022-06-16 16:37:23', '2022-06-16 16:37:23+03' ); SELECT * FROM date_table;
PostgreSQL hält sich strikt an ISO 8601 und bevorzugt die standardisierten Datumsformate.