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