For tidszonen kan du:
SHOW timezone;
eller tilsvarende:
SELECT current_setting('TIMEZONE');
men dette kan være i ethvert format, der accepteres af serveren, så det kan returnere UTC , 08:00 , Australia/Victoria , eller lignende.
Frustrerende nok ser det ud til, at der ikke er nogen indbygget funktion til at rapportere tidsforskydningen fra UTC, som klienten bruger i timer og minutter, hvilket forekommer mig noget sindssygt. Du kan få offset ved at sammenligne den aktuelle tid i UTC med den aktuelle tid lokalt:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... men IMO er det renere at udtrække tz offset på sekunder fra current_timestamp og konverter til et interval:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Det vil matche det ønskede resultat, bortset fra at det ikke giver et indledende nul, så -05:00 er kun -5:00 . Irriterende nok ser det ud til at være umuligt at få to_char at producere et førende nul i timevis, hvilket efterlader mig med følgende grimme manuelle formatering:
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;
Kredit til Glenn for timezone_hour og timezone_minute i stedet for det hack, jeg brugte tidligere med extract(timezone from current_timestamp) * INTERVAL '1' second) og en CTE.
Hvis du ikke har brug for det indledende nul, kan du i stedet bruge:
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;
Se også:
- Lokal tidszoneforskydning i PostgreSQL
- Hvordan man kender en tidszone for et tidsstempel i postgresql 8.3