2015-01-29 8 views
17

Chcę uzyskać aktualną nazwę strefy czasowej. co już osiągnięte jest uzyskanie/skrótu strefy czasowej utc_offset poprzez:Jak uzyskać aktualną nazwę strefy czasowej w Postgresie 9.3?

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE') 

To daje mi wszystkie kombinacje Kontynent/kapitału dla tej strefy czasowej, ale nie dokładną strefę czasową. Na przykład dostaję:

Europe/Amsterdam 
Europe/Berlin 

Serwer jest w Berlinie i chcę uzyskać nazwę strefy czasowej serwera.

Problem jaki mam z CET, że zawsze jest to UTC + 01: 00 i nie uwzględnia DST iirc.

+0

Właściwą nazwą strefy czasowej dla Berlina i Amsterdamu jest czas środkowoeuropejski (CET). Ogólnie nazwy stref czasowych i skróty nie są dobrze zdefiniowane; podczas gdy istnieje standard ISO, wiele krajów stosuje własne definicje. Obsługa PostgreSQL również nie jest kompletna, więcej szczegółów można znaleźć na stronie http://www.postgresql.org/docs/9.4/static/datetime-config-files.html. – Patrick

+0

W tabeli pg_timezone_names CET jest zdefiniowany jako skrót, a np. "Europa/Berlin" jako nazwa. Potrzebuję nazwy, a nie skrótu. – Deutro

+0

Link podany w poprzednim komentarzu pokazuje, w jaki sposób możesz edytować pliki, aby zapewnić to, czego potrzebujesz. To jest tak dobre, jak to tylko możliwe. – Patrick

Odpowiedz

31

Nie sądzę, że jest to możliwe przy użyciu samego PostgreSQL w najbardziej ogólnym przypadku. Podczas instalacji PostgreSQL wybierasz strefę czasową. Jestem prawie pewien, że domyślnie używamy strefy czasowej systemu operacyjnego. Zwykle będzie to odzwierciedlone w postgresql.conf jako wartość parametru "strefa czasowa". Ale wartość kończy się jako "czas lokalny". Możesz zobaczyć to ustawienie za pomocą instrukcji SQL.

show timezone; 

Ale jeśli zmienić strefę czasową w postgresql.conf coś jak „Europe/Berlin”, a następnie show timezone; powróci że wartość zamiast „localtime”.

Więc myślę, że twoje rozwiązanie będzie wymagało ustawienia "strefy czasowej" w postgresql.conf na jawną wartość zamiast domyślnego "czasu lokalnego".

+0

Dzięki za odpowiedź. Coś dziwnego, że nie można uzyskać strefy czasowej systemów. – Deutro

+0

Aby ustawić strefę czasową, możesz użyć 'set timezone to 'UTC''. – ivkremer

+0

@ivkremer: 'set timezone' ustawia strefę czasową dla jednej sesji klienta; nie ustawia strefy czasowej dla serwera PostgreSQL. –

7

To może lub nie może pomóc rozwiązać problem, OP, ale aby uzyskać czasową bieżącego serwera w stosunku do UTC (UT1 technicznie), wykonaj następujące czynności:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0; 

Powyższe prace przez ekstrakcję UT1-względne przesunięcie w minutach, a następnie przeliczenie go na godziny z wykorzystaniem współczynnika 3600 sekund/godzinę.

przykład:

SET SESSION timezone TO 'Asia/Kabul'; 
SELECT EXTRACT(TIMEZONE FROM now())/3600.0; 
-- output: 4.5 (as of the writing of this post) 

(docs).

+4

Kolejny użytkownik [proponowane] (http://stackoverflow.com/review/suggested-edits/12763260) za pomocą 'WYBIERZ EKSTRAKT (TIMEZONE_HOUR FROM now())', ale jest to nieco niebezpieczne, ponieważ ** ignoruje ** fakt że są tam ** zarówno strefy pół, jak i kwartały **. @giladMayani – koyae

+2

_ "Korea Północna, Nowa Fundlandia, Indie, Iran, Afganistan, Wenezuela, Birma, Sri Lanka, Markizy, a także części Australii używają półgodzinnych odchyleń od standardowego czasu.Niektóre narody, takie jak Nepal, a niektóre prowincje, takie jak Wyspy Chatham, używają odstępstw od kwadransa. "([link] (https://en.wikipedia.org/wiki/Time_zone#Worldwide_time_zones)) – koyae

3

Zobacz tę odpowiedź: Source

Jeśli strefa czasowa nie jest określony w postgresql.conf lub jako opcja wiersza poleceń serwera, serwer próbuje użyć wartości zmiennej środowiskowej TZ jako domyślnej strefy czasowej . Jeśli TZ nie jest zdefiniowana lub nie jest żadną z nazw stref czasowych znanych z PostgreSQL, serwer próbuje określić domyślną strefę czasową systemu operacyjnego, sprawdzając zachowanie funkcji bibliotecznej localtime(). Domyślna strefa czasowa jest wybierana jako najbliższa zgodna ze znanymi strefami czasowymi PostgreSQL. (Zasady te stosuje się również do wyboru domyślnej wartości log_timezone, jeśli nie podano.) source

Oznacza to, że jeśli nie określić strefę czasową, serwer próbuje określić domyślną strefę czasową systemu operacyjnego poprzez sprawdzenie zachowanie funkcji biblioteki C czasu lokalnego().

Jeśli strefa czasowa nie jest określona w postgresql.conf lub jako opcja wiersza polecenia serwera, serwer próbuje użyć wartości zmiennej środowiskowej TZ jako domyślnej strefy czasowej.

Wygląda na to, że strefa czasowa systemu jest rzeczywiście możliwa.

Uzyskaj lokalną strefę czasową OS z powłoki. W języku psql:

=> \! date +%Z 
Powiązane problemy