PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von AT TIME ZONE in PostgreSQL

In PostgreSQL können Sie den AT TIME ZONE verwenden -Klausel zum Konvertieren eines Zeitstempels in eine andere Zeitzone.

Syntax

Sie können es mit einer der folgenden drei Varianten verwenden:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Wo zone ist die Zeitzone, in die der Wert auf der linken Seite konvertiert werden soll.

Zur Verdeutlichung:Der einzige Unterschied zwischen den drei Varianten liegt im Datentyp des zu konvertierenden Zeitstempels.

Die drei Datentypen sind:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Das Ergebnis hängt vom Datentyp ab.

Die folgende Tabelle zeigt das Ergebnis, das jede Variante erzeugt.

Ausdruck Rückgabetyp Beschreibung
timestamp with time zone AT TIME ZONE zone timestamp without time zone Gegebenen Zeitstempel mit Zeitzone umwandeln in die neue Zeitzone, ohne Zeitzonenbezeichnung
timestamp without time zone AT TIME ZONE zone timestamp with time zone Behandle den gegebenen Zeitstempel ohne Zeitzone wie in der angegebenen Zeitzone gelegen
time with time zone AT TIME ZONE zone time with time zone Konvertieren Sie die angegebene Zeit mit der Zeitzone in die neue Zeitzone

Variante 1

Folgendes passiert, wenn Sie einen timestamp with time zone konvertieren Wert.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

2025-11-20 02:00:00

Wenn der ursprüngliche Zeitstempel ein timestamp with time zone ist Wert, wird er in die angegebene Zeitzone verschoben und das Ergebnis wird ohne Zeitzonen-Offset zurückgegeben.

Folgendes passiert, wenn ich den Zeitzonen-Offset des Eingabewerts ändere.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

2025-11-20 01:00:00

Der resultierende Zeitstempel wird entsprechend der eingegebenen Zeitzone verschoben.

Und wenn Sie timestamp with time zone angeben , aber der ursprüngliche Zeitstempel enthält eigentlich keine Zeitzone, dann wird die lokale Zeitzone angenommen.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

2025-11-19 16:00:00

In diesem Fall wurde der resultierende Zeitstempel um acht Stunden zurückgestellt. Das bedeutet, dass meine lokale Zeitzone der von Afrika/Kairo acht Stunden voraus ist.

Wir können den verwendeten Zeitzonen-Offset sehen, indem wir den Eingabewert direkt auswählen.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Ergebnis:

2025-11-20 00:00:00+10

Variante 2

Folgendes passiert, wenn der ursprüngliche Zeitstempel einen timestamp without time zone verwendet Wert.

Mit anderen Worten, es nicht schließen Sie eine Zeitzone ein.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

2025-11-20 08:00:00+10

Wenn der ursprüngliche Zeitstempel keine Zeitzone enthält, wird das Ergebnis mit der aktuellen TimeZone angezeigt Einstellung und der Zeitzonen-Offset wird angehängt.

Dies gilt immer dann, wenn Sie timestamp without time zone angeben , auch wenn der Zeitstempel tatsächlich einen Zeitzonen-Offset enthält.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

2025-11-20 08:00:00+10

Das ist zu erwarten, denn wenn ich nur den timestamp without time zone auswähle Wert, das bekomme ich:

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Ergebnis:

2025-11-20 00:00:00

Variante 3

Folgendes passiert, wenn der ursprüngliche Zeitstempel eine time with time zone verwendet Wert.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

02:00:00+02

Es rechnet die angegebene time with time zone um -Wert in die neue Zeitzone und hängt den Zeitzonen-Offset an das Ergebnis an.

Folgendes passiert, wenn ich den Zeitzonen-Offset des Eingabewerts ändere.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

01:00:00+02

Der resultierende Zeitstempel wird entsprechend der eingegebenen Zeitzone verschoben.

Und wenn Sie time with time zone angeben , aber der ursprüngliche Zeitstempel enthält eigentlich keine Zeitzone, es wird die lokale Zeitzone angenommen.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

16:00:00+02

In diesem Fall wurde der resultierende Zeitstempel um acht Stunden zurückgesetzt (weil meine lokale Zeitzone acht Stunden vor Afrika/Kairo liegt).

Wir können den verwendeten Zeitzonen-Offset sehen, indem wir den Eingabewert direkt auswählen.

SELECT time with time zone '00:00:00';

Ergebnis:

00:00:00+10

Zeit ohne Zeitzone

Obwohl die Postgres-Dokumentation keine time without time zone enthält Variante, hier ist trotzdem ein Beispiel.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Ergebnis:

16:00:00+02

In diesem Beispiel wurde also die lokale Zeitzone als umzurechnende Zeitzone angenommen.