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

Manejo de zona horaria peculiar en una base de datos de Postgres

El problema parece no estar relacionado con Amazon RDS:tiene que ver con la convención utilizada por PostgreSQL. En este caso, usted hace tener el nombre de la zona horaria hacia atrás. Te refieres a 'UTC-01' donde escribes 'UTC+01' .
De el manual :

Entonces, la cadena de zona horaria utilizada para SET TIME ZONE (y la visualización de SHOW timezone , según corresponda) o el AT TIME ZONE construcción use el signo opuesto de lo que se muestra en timestamp (with time zone ) literales! Ese es un desacuerdo muy desafortunado entre el estándar ISO y SQL por un lado y POSIX por el otro. (Creo que POSIX tiene la culpa). Ver:

Pero 'CET' o 'UTC-01' ambos siguen siendo potencialmente incorrectos para París porque no están tomando reglas para el horario de verano en cuenta.
(DST es uno de los conceptos más tontos en la historia de la humanidad.)

París (como la mayor parte de Europa) usa CET durante el invierno y CEST durante el verano. Tus pruebas con 'CET' acaba de pasar a trabajar en noviembre. Si intenta lo mismo en verano, obtendrá un resultado incorrecto.

Para estar seguro, utilice siempre el nombre de la zona horaria 'Europe/Paris' , que considera las reglas de horario de verano. La llamada es más cara.

La función current_time tiene en cuenta las reglas del horario de verano si su configuración de zona horaria implica alguna. Pero 'UTC-01' es un desplazamiento de tiempo simple. Nunca uso el tipo de datos time with time zone o current_time para empezar. El manual una vez más:

Considere:

SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_winter
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST'   AS cest_summer
     , '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET'    AS cet_no_dst  -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
     , '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter

Relacionado: