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