Chcę uzyskać aktualną nazwę strefy czasowej. To, co już osiągnąłem, to uzyskanie utc_offset
skrótu / strefy czasowej za pośrednictwem:
SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')
To daje mi wszystkie kombinacje Kontynent / Stolica dla tej strefy czasowej, ale nie dokładne timezone
. Na przykład otrzymuję:
Europe/Amsterdam
Europe/Berlin
Serwer jest włączony Berlin
i chcę uzyskać nazwę strefy czasowej serwera.
Problem jaki mam z CET
tym jest zawsze UTC+01:00
i nie wyjaśnia DST iirc
.
postgresql
datetime
timezone
Deutro
źródło
źródło
Odpowiedzi:
Nie sądzę, aby było to możliwe przy użyciu samego PostgreSQL w najbardziej ogólnym przypadku. Instalując PostgreSQL, wybierasz strefę czasową. Jestem prawie pewien, że domyślnie jest używana strefa czasowa systemu operacyjnego. Zwykle będzie to odzwierciedlone w postgresql.conf jako wartość parametru „timezone”. Ale wartość kończy się jako „czas lokalny”. Możesz zobaczyć to ustawienie za pomocą instrukcji SQL.
show timezone;
Ale jeśli zmienisz strefę czasową w postgresql.conf na coś takiego jak „Europe / Berlin”,
show timezone;
zwróci tę 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".
źródło
set timezone to 'UTC'
.set timezone
ustawia strefę czasową dla jednej sesji klienta; nie ustawia strefy czasowej dla serwera PostgreSQL.To może, ale nie musi, pomóc w rozwiązaniu problemu, OP, ale aby uzyskać strefę czasową bieżącego serwera względem UTC ( UT1 , technicznie), wykonaj:
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
Powyższe działa poprzez wyodrębnienie względnego przesunięcia UT1 w minutach, a następnie przekształcenie go na godziny przy użyciu 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)
( dokumenty ).
źródło
SELECT EXTRACT(TIMEZONE_HOUR FROM now())
, ale jest to umiarkowanie niebezpieczne, ponieważ ignoruje fakt, że istnieją zarówno pół, jak i ćwierć strefy czasowej . @giladMayaniWydaje się, że działa dobrze w Postgresql 9.5 :
SELECT current_setting('TIMEZONE');
źródło
Zobacz odpowiedź: Źródło
Oznacza to, że jeśli nie zdefiniujesz strefy czasowej, serwer spróbuje określić domyślną strefę czasową systemu operacyjnego, sprawdzając zachowanie funkcji biblioteki C localtime ().
Jeśli strefa czasowa nie jest określona w postgresql.conf lub jako opcja wiersza poleceń serwera, serwer próbuje użyć wartości zmiennej środowiskowej TZ jako domyślnej strefy czasowej.
Wydaje się, że ustawienie strefy czasowej systemu jest rzeczywiście możliwe.
Pobierz lokalną strefę czasową systemu operacyjnego z powłoki. W psql:
źródło
date +%Z
polecenie zwróci strefę czasową klienta, a nie serwer, przez który się połączyłeśpsql
Dostęp do strefy czasowej można uzyskać za pomocą następującego skryptu:
SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
wynik będzie:
źródło