0Pricing
SQL Academy · Lektion

Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ

Verstehen Sie den Unterschied zwischen TIMESTAMP und TIMESTAMPTZ, konvertieren Sie mit AT TIME ZONE und speichern Sie UTC für portable Anwendungen.

Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Zwei Zeitstempeltypen

PostgreSQL besitzt ZWEI Zeitstempeltypen:

  • TIMESTAMP — „naiver“ Zeitstempel ohne Zeitzoneninformationen
  • TIMESTAMPTZ — Zeitstempel mit Zeitzone (intern als UTC gespeichert)

Faustregel: Bevorzugen Sie TIMESTAMPTZ für Ereignisse und TIMESTAMP für rein abstrakte Uhrzeiten wie „9:00 Uhr während der Geschäftszeiten“.

So funktioniert TIMESTAMPTZ

Intern wird der Wert immer als UTC gespeichert. Beim INSERT wird Ihre Eingabe von der Sitzungszeitzone in UTC umgewandelt. Beim SELECT wird die Ausgabe wieder in die Sitzungszeitzone umgewandelt.

SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)

SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00

TIMESTAMP ist verlustbehaftet

Ein gewöhnlicher TIMESTAMP kennt die Zeitzone nicht. „2024-03-15 12:00:00“ könnte jede beliebige lokale Uhrzeit bedeuten. Wenn Benutzer die Zeitzone wechseln, geht die Bedeutung verloren.

AT TIME ZONE

Zwischen Zeitzonen für die Anzeige umwandeln:

SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo'        AS tokyo_time FROM events;

UTC speichern und lokal anzeigen

Bewährte Vorgehensweise: Speichern Sie TIMESTAMPTZ und wandeln Sie den Wert im SELECT in die Zeitzone des Benutzers um — niemals umgekehrt.

SELECT id,
       ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;

SESSION TIME ZONE

Sie können sie pro Sitzung, pro Benutzer oder global festlegen:

-- Session:
SET TIME ZONE 'Europe/Berlin';

-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';

-- Server default in postgresql.conf:
-- timezone = 'UTC'

Zeitzone in ein Literal aufnehmen

Betten Sie eine Zeitzone in das Literal ein:

SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;

NOW() gibt TIMESTAMPTZ zurück

NOW() und CURRENT_TIMESTAMP geben immer TIMESTAMPTZ zurück. Die Kombination mit TIMESTAMP-Spalten ist eine häufige Fehlerquelle.

Wann TIMESTAMP (ohne Zeitzone) richtig ist

Für abstrakte oder lokale Uhrzeiten, die tatsächlich nicht von einer Zeitzone abhängen — „das Geschäft öffnet um 09:00 Uhr“ — verwenden Sie TIMESTAMP (oder TIME).

CREATE TABLE store_hours (
  store_id BIGINT,
  open_at  TIME NOT NULL,
  close_at TIME NOT NULL
);

Sommerzeitumstellungen

TIMESTAMPTZ verarbeitet die Sommerzeit automatisch. Das Addieren eines INTERVAL funktioniert in Stunden der Wanduhr, außer Sie überschreiten den Übergang zur Sommerzeit — dann kann sich der Wert um 23 oder 25 Stunden verschieben.

SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31

Keine Offsets speichern, sondern Zeitzonennamen

Ein Offset wie +02:00 sagt Ihnen nicht, wann die Sommerzeit beginnt. Ein Zeitzonenname wie Europe/Berlin schon. Wenn Sie die Heimatzeitzone eines Benutzers speichern, verwenden Sie den IANA-Namen.

Zusammenfassung

Verwenden Sie für Ereignisse standardmäßig TIMESTAMPTZ.

  • Als UTC gespeichert, in der Sitzungszeitzone angezeigt
  • Für die Anzeige mit AT TIME ZONE umwandeln
  • TIMESTAMP (ohne Zeitzone) nur für abstrakte lokale Uhrzeiten verwenden

Kurzer Test

Sie entwickeln eine globale SaaS-Anwendung, die Benutzerereignisse protokolliert. Welchen Zeitstempeltyp sollten Sie für die Spalte occurred_at verwenden?

Häufig gestellte Fragen

Ist die Lektion „Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ“ kostenlos?

Ja — der vollständige Text von „Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ“?

Verstehen Sie den Unterschied zwischen TIMESTAMP und TIMESTAMPTZ, konvertieren Sie mit AT TIME ZONE und speichern Sie UTC für portable Anwendungen. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Datumsarithmetik und INTERVAL
  2. EXTRACT, DATE_TRUNC, AGE
  3. Zeitzonen: TIMESTAMP vs. TIMESTAMPTZ
  4. Häufige Datumsberichte (MTD, WoW, YoY)
← Zurück zu SQL Academy