Wie erhalte ich den aktuellen Zeitzonennamen in Postgres 9.3?

81

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 Berlinund ich möchte den Zeitzonennamen des Servers erhalten.

Das Problem, das ich damit habe CET, ist es immer UTC+01:00und erklärt es nicht DST iirc.

Deutro
quelle
Der richtige Zeitzonenname für Berlin und Amsterdam lautet Central European Time (CET). Im Allgemeinen sind Zeitzonennamen und Abkürzungen nicht genau definiert. Während es einen ISO-Standard gibt, verwenden viele Länder ihre eigenen Definitionen. Die PostgreSQL-Unterstützung ist ebenfalls nicht vollständig. Weitere Informationen finden Sie unter postgresql.org/docs/9.4/static/datetime-config-files.html .
Patrick
1
In der Tabelle pg_timezone_names wird CET als Abkürzung und zB "Europa / Berlin" als Name definiert. Ich brauche den Namen und nicht die Abkürzung.
Deutro
Der Link, den ich in meinem vorherigen Kommentar angegeben habe, zeigt Ihnen, wie Sie die Dateien bearbeiten können, um das zu liefern, was Sie benötigen. Das ist so gut wie es nur geht.
Patrick
Es gibt also keine Möglichkeit für Postgres, mir zu sagen, ob ich in "Europa / Berlin" oder "Europa / Amsterdam" bin, nur dass ich mich in der Zeitzone MEZ befinde.
Deutro
Können Sie Ihre Frage bearbeiten und "Ich bin in" definieren? Ein Server befindet sich (normalerweise) an einem festen Ort und die Zeitzone wird dem Betriebssystem oder der Konfigurationsdatei entnommen. Der tz-Name ist so fest wie der Server. Möchten Sie also tatsächlich den Zeitzonennamen des Servers oder der Daten in der Datenbank?
Patrick

Antworten:

119

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.

Mike Sherrill 'Cat Recall'
quelle
Danke für deine Antwort. Seltsam, dass es nicht möglich ist, die Zeitzone des Systems abzurufen.
Deutro
3
Und um die Zeitzone einzustellen, können Sie verwenden set timezone to 'UTC'.
ivkremer
@ivkremer: Legt set timezonedie Zeitzone für eine Client-Sitzung fest. Die Zeitzone für den PostgreSQL-Server wird nicht festgelegt.
Mike Sherrill 'Cat Recall'
@ MikeSherrill'CatRecall 'danke, ich habe es nicht überprüft.
ivkremer
25

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

Koyae
quelle
6
Ein anderer Benutzer schlug die Verwendung vor 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. @ GiladMayani
Koyae
2
"Nordkorea, Neufundland, Indien, Iran, Afghanistan, Venezuela, Burma, Sri Lanka, die Marquesas sowie Teile Australiens verwenden halbstündige Abweichungen von der Standardzeit. Einige Nationen wie Nepal und einige Provinzen wie Verwenden Sie auf den Chatham-Inseln viertelstündige Abweichungen. " ( Link )
Koyae
21

In Postgresql 9.5 scheint es gut zu funktionieren :

SELECT current_setting('TIMEZONE');
KotGaf
quelle
Ich habe Ihren Befehl ausgeführt und 15.200 Zeilen zurückgegeben, obwohl alle dieselbe Zeitzone haben.
Subhendu Mahanta
9

Siehe diese Antwort: Quelle

Wenn in postgresql.conf oder als Serverbefehlszeilenoption keine Zeitzone angegeben ist, versucht der Server, den Wert der Umgebungsvariablen TZ als Standardzeitzone zu verwenden. Wenn TZ nicht definiert ist oder keiner der PostzreSQL bekannten Zeitzonennamen ist, versucht der Server, die Standardzeitzone des Betriebssystems zu ermitteln, indem er das Verhalten der C-Bibliotheksfunktion localtime () überprüft. Die Standardzeitzone wird als die engste Übereinstimmung zwischen den bekannten Zeitzonen von PostgreSQL ausgewählt. (Diese Regeln werden auch verwendet, um den Standardwert von log_timezone auszuwählen, falls nicht angegeben.) 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:

=> \! date +%Z
Igoranze
quelle
2
date +%ZBefehl gibt die Zeitzone des Clients zurück, nicht die Server, über die Sie eine Verbindung hergestellt habenpsql
Eugen
8

Sie können mit dem folgenden Skript auf die Zeitzone zugreifen:

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting ('TIMEZONE') gibt Ihnen Informationen zu Einstellungen für Kontinent / Hauptstadt
  • pg_timezone_names Die Ansicht pg_timezone_names enthält eine Liste von Zeitzonennamen, die von SET TIMEZONE erkannt werden, sowie die zugehörigen Abkürzungen, UTC-Offsets und den Sommerzeitstatus.
  • Die Namensspalte in einer Ansicht (pg_timezone_names) ist der Name der Zeitzone.

Ausgabe wird sein:

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
Sachin R.
quelle