PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgresql date_trunc avec le fuseau horaire décale la zone de 1 heure

Il est prévu d'avoir deux variantes de date_trunc  :un pour timestamp et un pour timestamptz , car la doc dit :

Si vous souhaitez mieux comprendre l'horodatage et l'horodatage, lisez d'abord la bonne réponse ici .

Puis à propos de date_trunc . Selon mes expériences et mon interprétation de diverses réponses SO (comme celui-ci ), tout se comporte comme si, lors de la réception d'un timestamptz, date_trunc le convertit d'abord en un horodatage. Cette conversion renvoie un horodatage en heure locale. Puis la troncature est effectuée :ne gardez que la date et supprimez les heures/min/secondes.

Pour éviter cette conversion (merci pozs), fournissez un horodatage (pas timestamptz) à date_trunc :

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

la partie at time zone 'UTC' dit "convertir cet horodatage en un horodatage en heure UTC" (l'heure n'est pas affectée par cette conversion). Alors date_trunc renvoie 2001-07-16 00:00:00 .