PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Valore di offset del fuso orario del server

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: