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
.