sql >> Base de Datos >  >> RDS >> PostgreSQL

Valor de desplazamiento de la zona horaria del servidor

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: