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

Postgresql date_trunc con zona horaria cambia de zona por 1 hora

Se espera que tenga dos variantes de date_trunc :uno para timestamp y uno para timestamptz , porque el documento dice:

Si desea comprender mejor la marca de tiempo y la marca de tiempo, lea primero la gran respuesta aquí .

Entonces sobre date_trunc . Según mis experimentos y la interpretación de varias respuestas SO (como esta ), todo se comporta como si, al recibir un timestamptz, date_trunc primero lo convierte en una marca de tiempo. Esta conversión devuelve una marca de tiempo en hora local. Luego se realiza el truncamiento:mantenga solo la fecha y elimine las horas/min/segundos.

Para evitar esta conversión (gracias pozs), proporcione una marca de tiempo (no timestamptz) a date_trunc:

date_trunc('day', TIMESTAMPTZ '2001-07-16 23:38:40Z' at time zone 'UTC')

la parte at time zone 'UTC' dice "convertir esta marca de tiempo a una marca de tiempo en hora UTC" (la hora no se ve afectada por esta conversión). Entonces date_trunc devuelve 2001-07-16 00:00:00 .