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