Voor de tijdzone kunt u:
SHOW timezone;
of het equivalent:
SELECT current_setting('TIMEZONE');
maar dit kan in elk formaat zijn dat door de server wordt geaccepteerd, dus het kan UTC
. teruggeven , 08:00
, Australia/Victoria
, of iets dergelijks.
Frustrerend genoeg lijkt er geen ingebouwde functie te zijn om de tijdverschuiving van UTC die de client gebruikt in uren en minuten te rapporteren, wat mij nogal krankzinnig lijkt. U kunt de afwijking krijgen door de huidige tijd in UTC te vergelijken met de huidige tijd ter plaatse:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... maar IMO is het schoner om de tz-offset in seconden te extraheren uit de current_timestamp
en converteren naar een interval:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Dat komt overeen met het gewenste resultaat, behalve dat het geen voorloopnul oplevert, dus -05:00
is gewoon -5:00
. Vervelend genoeg lijkt het onmogelijk om to_char
. te krijgen om urenlang een voorloopnul te produceren, waardoor ik de volgende lelijke handmatige opmaak overhoud:
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;
Met dank aan Glenn voor timezone_hour
en timezone_minute
in plaats van de hack die ik eerder gebruikte met extract(timezone from current_timestamp) * INTERVAL '1' second)
en een CTE.
Als u de voorloopnul niet nodig heeft, kunt u in plaats daarvan het volgende gebruiken:
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;
Zie ook:
- Lokale tijdzoneverschuiving in PostgreSQL
- Hoe weet u een tijdzone van een tijdstempel in postgresql 8.3