PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Valor de deslocamento do fuso horário do servidor


Para o fuso horário, você pode:
SHOW timezone;

ou equivalente:
SELECT current_setting('TIMEZONE');

mas isso pode estar em qualquer formato aceito pelo servidor, então pode retornar UTC , 08:00 , Australia/Victoria , ou similar.

Frustrantemente, parece não haver nenhuma função interna para relatar o deslocamento de tempo do UTC que o cliente está usando em horas e minutos, o que parece meio insano para mim. Você pode obter o deslocamento comparando a hora atual em UTC com a hora atual localmente:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`

... mas IMO é mais limpo extrair o deslocamento tz em segundos do current_timestamp e converta para um intervalo:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');

Isso corresponderá ao resultado desejado, exceto que não produz um zero à esquerda, então -05:00 é apenas -5:00 . Irritantemente parece ser impossível obter to_char para produzir um zero à esquerda por horas, deixando-me com a seguinte formatação manual feia:
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;

Crédito para Glenn por timezone_hour e timezone_minute em vez do hack que usei anteriormente com extract(timezone from current_timestamp) * INTERVAL '1' second) e um CTE.

Se você não precisar do zero à esquerda, poderá usar:
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;

Veja também: