HOWTO · PostgreSQL

So verwenden Sie die aktuelle UTC-Zeit als Standard in PostgreSQL

Erfahren Sie, wie Sie die aktuelle Zeit in UTC abrufen und als Standardwert für eine PostgreSQL-Spalte verwenden.

Auf dieser Seite

Um die aktuelle Uhrzeit als UTC-Uhrzeit in PostgreSQL zu erhalten, verwenden Sie now() AT TIME ZONE 'UTC'. Soll eine Spalte vom Typ timestamp without time zone diesen Wert erhalten, wenn ein INSERT die Spalte auslässt, verwenden Sie denselben Ausdruck als DEFAULT. Der Wert enthält ein Datum und eine Uhrzeit, aber keine Zeitzonenangabe. Soll die Spalte einen Zeitpunkt darstellen, verwenden Sie stattdessen timestamp with time zone.

Die folgenden SQL-Beispiele dienen der Veranschaulichung und wurden nicht auf einem PostgreSQL-Server ausgeführt. Das Python-Beispiel veranschaulicht deterministisch die Darstellung einer UTC-Uhrzeit; es stellt keine Verbindung zu PostgreSQL her.

Aktuelle Uhrzeit in UTC in PostgreSQL abrufen

Führen Sie SELECT now() AT TIME ZONE 'UTC'; aus, um eine UTC-Uhrzeit zu erhalten. PostgreSQL gibt mit now() den Startzeitpunkt der aktuellen Transaktion zurück. Wiederholte Aufrufe innerhalb derselben Transaktion liefern daher denselben Zeitpunkt. Die Operation AT TIME ZONE wandelt diesen Zeitpunkt vom Typ timestamp with time zone in einen Wert vom Typ timestamp without time zone um, dessen Datums- und Uhrzeitfelder UTC anzeigen. Das Ergebnis selbst enthält weder eine Zeitzone noch einen UTC-Offset.

Im Vergleich dazu gibt SELECT now(); einen Wert vom Typ timestamp with time zone zurück. PostgreSQL zeigt diesen Zeitpunkt in der Zeitzone der Sitzung an; die Anzeige ändert den Zeitpunkt jedoch nicht. Ein timestamp without time zone speichert nur Kalender- und Uhrzeitfelder: Angaben zu Zeitzone oder UTC-Offset sind nicht enthalten, und der Wert ist nicht automatisch UTC. Verwenden Sie diesen Typ für UTC-Uhrzeiten nur, wenn Ihre Anwendung und Ihre Datenbank dieselbe Bedeutung zugrunde legen.

UTC-Zeitstempel als Standardwert für eine Tabellenspalte festlegen

Für eine Spalte, die UTC-Uhrzeiten speichern soll, legen Sie den Typ timestamp without time zone fest und verwenden DEFAULT (now() AT TIME ZONE 'UTC'). Der SQL-Ausdruck sieht beispielsweise so aus: CREATE TABLE event_log (created_at timestamp without time zone DEFAULT (now() AT TIME ZONE 'UTC'), event_name text);. Die Klammern um den Standardausdruck sind optional.

Fügen Sie eine Zeile ein und lassen Sie dabei created_at aus, zum Beispiel mit INSERT INTO event_log (event_name) VALUES ('started');. PostgreSQL wertet dann den Standardwert für diese Spalte aus. Ein ausdrücklich für created_at angegebener Wert hat Vorrang. Der Standardwert wird beim Einfügen angewendet; später aktualisiert er den Wert nicht automatisch. Da now() auf den Transaktionsstart festgelegt ist, erhalten in derselben Transaktion eingefügte Zeilen denselben Zeitstempel. Für Ereignisdaten, die einen Zeitpunkt über verschiedene Clients hinweg darstellen sollen, ist timestamp with time zone im Allgemeinen geeigneter; jede Sitzung kann diesen Zeitpunkt in ihrer eigenen Zeitzone anzeigen.

Aktuelle Uhrzeit in UTC umwandeln

Die entsprechende Funktionsform lautet timezone('UTC', now()). PostgreSQLs timezone() akzeptiert eine Zeitzone und einen Zeitstempelwert; mit now() gibt die Funktion einen Wert vom Typ timestamp without time zone zurück, der den Zeitpunkt in UTC anzeigt. Dabei handelt es sich um eine Zeitstempelumwandlung, nicht um eine Umwandlung in den Typ TIME. Bei der Form AT TIME ZONE ist die Richtung der Umwandlung im Ausdruck erkennbar.

Ein festgelegter Zeitpunkt macht den Unterschied zwischen einem Zeitpunkt und einer UTC-Uhrzeit anschaulich. Diese Python-Illustration verwendet die Standardbibliothek und gibt einen Zeitstempel ohne Zeitzonenangabe aus:

from datetime import datetime, timezone

instant = datetime(2026, 10, 23, 12, 0, tzinfo=timezone.utc)
utc_clock_reading = instant.astimezone(timezone.utc).replace(tzinfo=None)
print(utc_clock_reading.isoformat(sep=" "))
2026-10-23 12:00:00

Dieses Beispiel veranschaulicht die Wertform, die der SQL-Ausdruck erzeugt; der Python-Code führt kein SQL aus. Verwenden Sie now()::timestamp nicht als Ersatz für eine UTC-Umwandlung: Beim Umwandeln eines timestamp with time zone in timestamp without time zone wird die Zeitzone der Sitzung verwendet. Die Uhrzeitfelder hängen daher von dieser Einstellung ab. Die Intervallform timezone(INTERVAL '+00:00', now()) verwendet ebenfalls einen Offset von null und liefert die UTC-Uhrzeit. Ein Offset ungleich null, etwa INTERVAL '-08:00', entspricht einer anderen Uhrzeit.

SQL-Funktion für einen wiederverwendbaren UTC-Standardwert verwenden

Wenn mehrere Tabellendefinitionen denselben Ausdruck benötigen, können Sie ihm mit einer optionalen SQL-Funktion einen wiederverwendbaren Namen geben. Definieren Sie die Funktion so, dass sie timestamp without time zone zurückgibt: CREATE FUNCTION current_utc_timestamp() RETURNS timestamp without time zone LANGUAGE sql STABLE AS 'SELECT now() AT TIME ZONE ''UTC''';. Verwenden Sie anschließend DEFAULT current_utc_timestamp() in einer Spaltendefinition.

Die Funktion kapselt den Ausdruck; sie lässt die Uhr innerhalb einer Transaktion nicht weiterlaufen und ändert auch den Rückgabetyp nicht. Wie beim direkten Standardwert erhält eine Spalte mit dieser Funktion ihren Wert beim Einfügen einer Zeile und nur dann, wenn der INSERT keinen Wert für diese Spalte angibt. Richten Sie den Typ nach der Bedeutung der Daten aus: Verwenden Sie timestamp without time zone für eine UTC-Uhrzeit, deren Bedeutung als UTC per Konvention festgelegt ist, und im Allgemeinen timestamp with time zone, wenn Sie einen Zeitpunkt speichern.