W przypadku strefy czasowej możesz:
SHOW timezone;
lub odpowiednik:
SELECT current_setting('TIMEZONE');
ale może to być dowolny format akceptowany przez serwer, więc może zwrócić UTC , 08:00 , Australia/Victoria lub podobne.
Co frustrujące, wydaje się, że nie ma wbudowanej funkcji do raportowania przesunięcia czasu względem UTC, którego używa klient, w godzinach i minutach, co wydaje mi się trochę szalone. Możesz uzyskać przesunięcie, porównując bieżący czas w UTC z bieżącym czasem lokalnie:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... ale IMO lepiej jest wyodrębnić przesunięcie tz w sekundach z current_timestamp i przekonwertuj na interwał:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
To będzie pasować do pożądanego wyniku, z wyjątkiem tego, że nie da wiodącego zera, więc -05:00 jest tylko -5:00 . Irytujące wydaje się, że niemożliwe jest uzyskanie to_char aby utworzyć wiodące zero dla godzin, zostawiając mnie z następującym brzydkim formatowaniem ręcznym:
CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
to_char(extract(timezone_minute FROM current_timestamp),'FM00');
$$ LANGUAGE 'SQL' STABLE;
Kredyt dla Glenna za timezone_hour i timezone_minute zamiast hacka, którego użyłem wcześniej z extract(timezone from current_timestamp) * INTERVAL '1' second) i CTE.
Jeśli nie potrzebujesz wiodącego zera, możesz zamiast tego użyć:
CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
$$ LANGUAGE 'SQL' STABLE;
Zobacz też:
- Przesunięcie lokalnej strefy czasowej w PostgreSQL
- Jak poznać strefę czasową znacznika czasu w postgresql 8.3