PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgresql date_trunc com fuso horário muda de zona em 1 hora


Espera-se que tenha duas variantes de date_trunc :um para timestamp e um para timestamptz , porque o documento diz:

Se você quiser entender melhor timestamp e timestamptz, leia primeiro a ótima resposta aqui .

Então sobre date_trunc . De acordo com meus experimentos e interpretação de várias respostas SO (como este ), tudo se comporta como se, ao receber um timestamptz, date_trunc primeiro o converte em um carimbo de data/hora. Essa conversão retorna um carimbo de data/hora na hora local. Em seguida, o truncamento é realizado:mantenha apenas a data e descarte as horas/min/segundos.

Para evitar essa conversão (obrigado pozs), forneça um timestamp (não timestamptz) para date_trunc:
date_trunc('day', TIMESTAMPTZ '2001-07-16 23:38:40Z' at time zone 'UTC')

a parte at time zone 'UTC' diz "converter este timestamptz para um timestamp no horário UTC" (a hora não é afetada por essa conversão). Então date_trunc retorna 2001-07-16 00:00:00 .