Para la zona horaria puedes:
SHOW timezone;
o el equivalente:
SELECT current_setting('TIMEZONE');
pero esto puede estar en cualquier formato aceptado por el servidor, por lo que puede devolver UTC
, 08:00
, Australia/Victoria
, o similar.
De manera frustrante, parece que no hay una función integrada para informar el desplazamiento de tiempo de UTC que el cliente está usando en horas y minutos, lo que me parece una locura. Puede obtener la compensación comparando la hora actual en UTC con la hora actual localmente:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... pero en mi opinión, es más limpio extraer el desplazamiento tz en segundos del current_timestamp
y convertir a un intervalo:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Eso coincidirá con el resultado deseado, excepto que no produce un cero inicial, por lo que -05:00
es solo -5:00
. Es molesto que parezca imposible obtener to_char
para producir un cero inicial durante horas, dejándome con el siguiente formato manual feo:
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 a Glenn por timezone_hour
y timezone_minute
en lugar del truco que usé antes con extract(timezone from current_timestamp) * INTERVAL '1' second)
y un CTE.
Si no necesita el cero inicial, puede 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;
Véase también:
- Compensación de zona horaria local en PostgreSQL
- Cómo saber una zona horaria de una marca de tiempo en postgresql 8.3