PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgresql date_trunc con fuso orario sposta la zona di 1 ora

Dovrebbe avere due varianti di date_trunc :uno per timestamp e uno per timestamptz , perché il documento dice:

Se vuoi comprendere meglio timestamp e timestamptz, leggi prima l'ottima risposta qui .

Quindi su date_trunc . Secondo i miei esperimenti e l'interpretazione di varie risposte SO (come questo ), tutto si comporta come se, quando si riceve un timestamptz, date_trunc prima lo converte in un timestamp. Questa conversione restituisce un timestamp nell'ora locale. Quindi viene eseguito il troncamento:mantieni solo la data e rilascia le ore/min/secondi.

Per evitare questa conversione (grazie pozs), fornisci un timestamp (non 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 "converti questo timestamptz in un timestamp nell'ora UTC" (l'ora non è influenzata da questa conversione). Quindi date_trunc restituisce 2001-07-16 00:00:00 .