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

Qual è un tipo di dati appropriato per memorizzare un fuso orario?

Sfortunatamente PostgreSQL non offre un tipo di dati di fuso orario, quindi probabilmente dovresti usare text .

interval a prima vista sembra un'opzione logica e lo è appropriato per alcuni usi. Tuttavia, non prende in considerazione l'ora legale, né considera il fatto che diverse regioni nella stessa differenza UTC hanno regole DST diverse.

Non esiste una mappatura 1:1 dall'offset UTC al fuso orario.

Ad esempio, il fuso orario di Australia/Sydney (Nuovo Galles del Sud) è UTC+10 (EST ), o UTC+11 (EDT ) durante l'ora legale. Sì, è lo stesso acronimo EST che gli USA utilizzano; gli acronimi dei fusi orari non sono univoci nel database tzdata, motivo per cui Pg ha le timezone_abbreviations ambientazione. Peggio ancora, Brisbane (Queensland) è quasi alla stessa longditudine ed è in UTC+10 EST ... ma non ha l'ora legale, quindi a volte è a un -1 spostato nel Nuovo Galles del Sud durante l'ora legale del NSW.

(Aggiorna :Più recentemente l'Australia ha adottato un A prefisso, quindi utilizza AEST come il suo acronimo TZ degli stati orientali, ma EST e WST rimangono di uso comune).

Confonde molto?

Se tutto ciò che devi memorizzare è un offset UTC quindi un interval è appropriato. Se desideri memorizzare un fuso orario , salvalo come text . È difficile convalidare e convertire in un fuso orario sfalsato al momento, ma almeno fa fronte all'ora legale.