In PostgreSQL können Sie die timezone()
verwenden Funktion zum Konvertieren eines Zeitstempels in eine andere Zeitzone.
Syntax
Die Syntax lautet wie folgt:
timezone(zone, timestamp)
Wo zone
ist die Zeitzone, die Sie als timestamp
verwenden möchten Argument, in das umgewandelt werden soll.
Das Ergebnis, das Sie erhalten, hängt davon ab, ob der ursprüngliche Zeitstempelwert eine Zeitzone enthält oder nicht (und welchen Wert dieser Wert hat).
Beispiel 1 – Wenn der ursprüngliche Zeitstempel die Zeitzone enthält
Folgendes passiert, wenn der ursprüngliche Zeitstempel die Zeitzone enthält.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Ergebnis:
2020-10-25 04:00:00
Wenn der ursprüngliche Zeitstempel die Zeitzone enthält, die timezone()
verschiebt den ursprünglichen Zeitstempelwert in die angegebene Zeitzone und gibt den Wert ohne Zeitzone zurück.
Folgendes passiert, wenn ich die Zeitzone des Eingabezeitstempels ändere.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Ergebnis:
2020-10-25 03: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 der ursprüngliche Zeitstempelwert in die lokale Zeitzone verschoben.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Ergebnis:
2020-10-24 18:00:00
In diesem Fall wurde der resultierende Zeitstempel um sechs Stunden zurückgestellt. Das bedeutet, dass meine lokale Zeitzone der indischen/Mauritius sechs Stunden voraus ist.
Wir können den verwendeten Zeitzonen-Offset sehen, indem wir den Eingabewert direkt auswählen.
SELECT timestamp with time zone '2020-10-25 00:00:00';
Ergebnis:
2020-10-25 00:00:00+10
Beispiel 2 – Wenn der ursprüngliche Zeitstempel NICHT die Zeitzone enthält
Folgendes passiert, wenn der ursprüngliche Zeitstempel nicht schließen Sie eine Zeitzone ein.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Ergebnis:
2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Ergebnis:
2020-10-25 06: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 '2020-10-25 00:00:00+12';
Ergebnis:
2020-10-25 00:00:00
Beispiel 3 – lokaler Zeitstempel
Lassen Sie uns den localtimestamp
verwenden Funktion, um einen Vergleich zwischen dem aktuellen Zeitstempel in meiner eigenen Zeitzone und dem resultierenden Zeitstempel nach Verwendung von timezone()
auszuführen Funktion zum Konvertieren in eine andere Zeitzone.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Ergebnis:
localtimestamp | 08.07.2020 15:42:04.965221Zeitzone | 08.07.2020 21:42:04.965221+10
Der localtimestamp
Funktion gibt einen Zeitstempel zurück Datentyp, der mit einem impliziten „ohne Zeitzone“ daherkommt. Mit anderen Worten, Zeitstempel und Zeitstempel ohne Zeitzone sind dasselbe.
Wie zuvor gezeigt, wird, wenn keine Zeitzone im ursprünglichen Zeitstempel angegeben ist, die aktuelle TimeZone
Einstellung wird verwendet und an das Ergebnis angehängt. Und das bekommen wir, wenn wir localtimestamp
verwenden .
Übrigens, in diesem Beispiel habe ich \x
verwendet um das Ergebnis mit erweiterter Anzeige/vertikaler Ausgabe anzuzeigen, nur um es leichter lesbar zu machen.
Beispiel 4 – aktueller_Zeitstempel
Lassen Sie uns nun den current_timestamp
verwenden Funktion anstelle von localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Ergebnis (bei vertikaler Ausgabe):
aktueller_Zeitstempel | 08.07.2020 15:42:04.335669+10Zeitzone | 08.07.2020 09:42:04.335669
Dieses Mal wurde der Zeitzonen-Offset an den ursprünglichen Zeitstempel und die timezone()
angehängt Ergebnis enthält es nicht mehr.
Wir erhalten dieses Ergebnis, weil current_timestamp
Funktion gibt einen Zeitstempel mit Zeitzone zurück Datentyp.
Beispiel 5 – Verwendung von Zeitwerten
Die timezone()
funktioniert auch mit time
Werte (time with time zone
und time without time zone
).
Allerdings, wenn es zur time with time zone
verwendet wird Werten wird der Zeitzonenoffset an das Ergebnis angehängt.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Ergebnis (bei vertikaler Ausgabe):
Zeitzone | 04:00:00+04Zeitzone | 03:00:00+04Zeitzone | 18:00:00+04
Und der Vollständigkeit halber sind hier dieselben Werte mit einer time without time zone
Datentyp.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Ergebnis (bei vertikaler Ausgabe):
Zeitzone | 18:00:00+04Zeitzone | 18:00:00+04Zeitzone | 18:00:00+04
Überprüfen Sie die lokale Zeitzone
Wenn Sie Ihre eigene lokale Zeitzone überprüfen möchten, führen Sie SHOW TIMEZONE
aus .
Folgendes bekomme ich, wenn ich diesen Befehl ausführe.
SHOW TIMEZONE;
Ergebnis:
Australien/Brisbane
Überprüfen Sie den Zeitzonenversatz
Bewaffnet mit dem oben genannten Wissen kann ich nun die beiden Zeitzonen-Offsets überprüfen, indem ich die pg_timezone_names
abfrage ansehen.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Ergebnis (bei vertikaler Ausgabe):
Weitere Optionen und Beispiele für die Rückgabe der Zeitzone in Postgres finden Sie unter Zurückgeben einer Liste der von PostgreSQL unterstützten Zeitzonen.