För tidszonen kan du:
SHOW timezone;
eller motsvarande:
SELECT current_setting('TIMEZONE');
men detta kan vara i vilket format som helst som accepteras av servern, så det kan returnera UTC
, 08:00
, Australia/Victoria
, eller liknande.
Frustrerande nog verkar det inte finnas någon inbyggd funktion för att rapportera tidsförskjutningen från UTC som klienten använder i timmar och minuter, vilket verkar ganska vansinnigt för mig. Du kan få offset genom att jämföra den aktuella tiden i UTC med den aktuella tiden lokalt:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... men IMO är det renare att extrahera tz-offset på några sekunder från current_timestamp
och konvertera till ett intervall:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Det matchar det önskade resultatet förutom att det inte ger en inledande nolla, så -05:00
är bara -5:00
. Irriterande nog verkar det vara omöjligt att få to_char
att producera en inledande nolla i timmar, vilket lämnar mig med följande fula manuella 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;
Tack till Glenn för timezone_hour
och timezone_minute
istället för hacket jag använde tidigare med extract(timezone from current_timestamp) * INTERVAL '1' second)
och en CTE.
Om du inte behöver den inledande nollan kan du istället använda:
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 även:
- Lokal tidszonförskjutning i PostgreSQL
- Hur man känner till en tidszon för en tidsstämpel i postgresql 8.3