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

Transforme la marca de tiempo a la hora local para una zona horaria dada durante 'COPIAR .. A ..'

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:

O, mucho mejor aún, use timestamptz en todas partes y funciona correctamente de forma automática.