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