Pro časové pásmo můžete:
SHOW timezone;
nebo ekvivalent:
SELECT current_setting('TIMEZONE');
ale to může být v jakémkoli formátu akceptovaném serverem, takže může vrátit UTC , 08:00 , Australia/Victoria , nebo podobně.
Frustrující je, že se zdá, že neexistuje žádná vestavěná funkce, která by hlásila časový posun od UTC, který klient používá v hodinách a minutách, což mi připadá trochu šílené. Posun můžete získat porovnáním aktuálního času v UTC s aktuálním místním časem:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... ale IMO je čistší extrahovat offset tz v sekundách z current_timestamp a převést na interval:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
To bude odpovídat požadovanému výsledku kromě toho, že nevytváří úvodní nulu, takže -05:00 je jen -5:00 . Nepříjemně se zdá, že je nemožné dostat to_char produkovat úvodní nulu po celé hodiny, takže mi zůstane následující ošklivé ruční formátování:
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 Glennovi za timezone_hour a timezone_minute místo hacku, který jsem použil dříve s extract(timezone from current_timestamp) * INTERVAL '1' second) a CTE.
Pokud nepotřebujete úvodní nulu, můžete místo toho použít:
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;
Viz také:
- Posun místního časového pásma v PostgreSQL
- Jak zjistit časové pásmo časového razítka v postgresql 8.3