Ich möchte den aktuellen Zeitzonennamen erhalten. Was ich bereits erreicht habe, ist, die utc_offset
/ die Zeitzonenabkürzung zu erhalten über:
SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')
Dies gibt mir alle Kontinent / Kapital-Kombinationen für diese Zeitzone, aber nicht die genauen timezone
. Zum Beispiel bekomme ich:
Europe/Amsterdam
Europe/Berlin
Der Server ist in Berlin
und ich möchte den Zeitzonennamen des Servers erhalten.
Das Problem, das ich damit habe CET
, ist es immer UTC+01:00
und erklärt es nicht DST iirc
.
postgresql
datetime
timezone
Deutro
quelle
quelle
Antworten:
Ich denke nicht, dass dies im allgemeinsten Fall mit PostgreSQL allein möglich ist. Wenn Sie PostgreSQL installieren, wählen Sie eine Zeitzone aus. Ich bin mir ziemlich sicher, dass standardmäßig die Zeitzone des Betriebssystems verwendet wird. Dies wird normalerweise in der postgresql.conf als Wert des Parameters "Zeitzone" angezeigt. Der Wert endet jedoch als "Ortszeit". Sie können diese Einstellung mit der SQL-Anweisung sehen.
show timezone;
Wenn Sie jedoch die Zeitzone in postgresql.conf in "Europa / Berlin" ändern,
show timezone;
wird dieser Wert anstelle von "Ortszeit" zurückgegeben.Ich denke also, dass Ihre Lösung darin besteht, "Zeitzone" in postgresql.conf auf einen expliziten Wert anstatt auf die Standard "Ortszeit" zu setzen.
quelle
set timezone to 'UTC'
.set timezone
die Zeitzone für eine Client-Sitzung fest. Die Zeitzone für den PostgreSQL-Server wird nicht festgelegt.Dies kann Ihnen helfen oder auch nicht, Ihr Problem zu beheben, OP, aber um die Zeitzone des aktuellen Servers relativ zu UTC ( UT1 , technisch) zu erhalten, gehen Sie wie folgt vor:
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
Das Obige funktioniert, indem der UT1-relative Versatz in Minuten extrahiert und dann mit dem Faktor 3600 Sekunden / Stunde in Stunden konvertiert wird.
Beispiel:
SET SESSION timezone TO 'Asia/Kabul'; SELECT EXTRACT(TIMEZONE FROM now())/3600.0; -- output: 4.5 (as of the writing of this post)
( docs ).
quelle
SELECT EXTRACT(TIMEZONE_HOUR FROM now())
, dies ist jedoch leicht gefährlich, da die Tatsache ignoriert wird , dass es sowohl Halb- als auch Viertelzeitzonen gibt. @ GiladMayaniIn Postgresql 9.5 scheint es gut zu funktionieren :
SELECT current_setting('TIMEZONE');
quelle
Siehe diese Antwort: Quelle
Wenn Sie also keine Zeitzone definieren, versucht der Server, die Standardzeitzone des Betriebssystems zu ermitteln, indem er das Verhalten der C-Bibliotheksfunktion localtime () überprüft.
Wenn in postgresql.conf oder als Serverbefehlszeilenoption keine Zeitzone angegeben ist, versucht der Server, den Wert der Umgebungsvariablen TZ als Standardzeitzone zu verwenden.
Es scheint tatsächlich möglich zu sein, die Zeitzone des Systems einzustellen.
Rufen Sie die lokale Zeitzone des Betriebssystems aus der Shell ab. In psql:
quelle
date +%Z
Befehl gibt die Zeitzone des Clients zurück, nicht die Server, über die Sie eine Verbindung hergestellt habenpsql
Sie können mit dem folgenden Skript auf die Zeitzone zugreifen:
SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
Ausgabe wird sein:
quelle