En primer lugar, debe usar timestamptz
en lugar de timestamp
siempre que trabaje con varias zonas horarias. Evitaría el problema por completo.
Detalles:
Tu puedes use el AT TIME ZONE
construir como @NuLo sugiere
, puede incluso funciona, pero no exactamente como se describe.
AT TIME ZONE
convierte el tipo timestamp
(timestamp without time zone
) a timestamptz
(timestamp with time zone
) y viceversa. La representación del texto de un timestamptz
el valor depende de la configuración actual de la zona horaria en la sesión en la que ejecuta el comando. Estos dos timestamptz
valores son 100 % idénticos (indican el mismo punto en el tiempo):
'2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
Pero la representación de texto es no . La pantalla es para diferentes zonas horarias. Si toma esta cadena literal y la alimenta a una timestamp
tipo, la parte de la zona horaria simplemente se ignora y terminas con diferente valores. Por lo tanto, si ejecuta su COPY
declaración en una sesión con la misma configuración de zona horaria que su timestamp
original los valores son para, la operación sugerida ocurre para trabajar.
La forma limpia, sin embargo, es producir la timestamp
correcta valores para comenzar aplicando AT TIME ZONE
dos veces :
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
'my_target_tz'
es "su propia zona horaria" y 'my_source_tz'
la zona horaria del servidor de la nube en el ejemplo. Para asegurarse de que se respete el horario de verano, use nombres de zona horaria , no abreviaturas de zona horaria. La documentación:
Relacionado:
- Contabilización del horario de verano en Postgres, al seleccionar elementos programados
- Los nombres de zona horaria con propiedades idénticas producen resultados diferentes cuando se aplican a la marca de tiempo
O, mucho mejor aún, use timestamptz
en todas partes y funciona correctamente de forma automática.