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