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:
- Compensação de fuso horário local no PostgreSQL
- Como saber o fuso horário de um timestamp no postgresql 8.3