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

Funktionsweise der timezone()-Funktion in PostgreSQL

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):

| Abkürzung | utc_offset | is_dst--------------------+--------+------------+------ --Indisch/Mauritius | +04 | 04:00:00 | fAustralien/Brisbane | AEST | 10:00:00 | f

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.