Per il fuso orario puoi:
SHOW timezone;
o l'equivalente:
SELECT current_setting('TIMEZONE');
ma questo può essere in qualsiasi formato accettato dal server, quindi potrebbe restituire UTC
, 08:00
, Australia/Victoria
, o simili.
In modo frustrante, sembra che non ci sia alcuna funzione integrata per segnalare la differenza di tempo dall'UTC che il cliente sta utilizzando in ore e minuti, il che mi sembra un po' folle. Puoi ottenere l'offset confrontando l'ora corrente in UTC con l'ora corrente localmente:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... ma IMO è più semplice estrarre l'offset tz in secondi dal current_timestamp
e converti in un intervallo:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Corrisponderà al risultato desiderato tranne per il fatto che non produce uno zero iniziale, quindi -05:00
è solo -5:00
. Stranamente sembra impossibile ottenere to_char
per produrre uno zero iniziale per ore, lasciandomi con la seguente brutta formattazione manuale:
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;
Credito a Glenn per timezone_hour
e timezone_minute
invece dell'hack che ho usato in precedenza con extract(timezone from current_timestamp) * INTERVAL '1' second)
e un CTE.
Se non hai bisogno dello zero iniziale puoi invece usare:
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;
Vedi anche:
- Offset del fuso orario locale in PostgreSQL
- Come conoscere un fuso orario di un timestamp in postgresql 8.3