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

PostgreSQL/JDBC e TIMESTAMP rispetto a TIMESTAMPTZ

In genere usa TIMESTAMPTZ

Ecco i consigli di David E. Wheeler, un esperto di Postgres, in un post sul blog il cui titolo dice tutto:
Usa sempre TIMESTAMP CON FUSO ORARIO (TIMESTAMPTZ)

Se stai monitorando momenti reali, punti specifici sulla sequenza temporale, utilizza TIMESTAMP WITH TIME ZONE .

Un'eccezione:partizionamento

L'unica eccezione di Wheeler è quando si esegue il partizionamento su timestamp, a causa di limitazioni tecniche. Una rara eccezione per la maggior parte di noi.

Per informazioni sul partizionamento, vedere doc e vedere il Wiki .

Nome improprio

I tipi di dati denominano timestamp with time zone e timestamp without time zone sono nomi impropri. In entrambi casi il valore data-ora è memorizzato in UTC (nessuna differenza di fuso orario). Leggi di nuovo quella frase precedente. UTC, sempre. La frase "con fuso orario" significa "con attenzione al fuso orario", non "memorizzare il fuso orario accanto a questo valore". La differenza tra i tipi è se qualsiasi fuso orario deve essere applicato durante l'archiviazione (INSERT o UPDATE) o il recupero (query SELECT). (Questo comportamento è descritto per Postgres -- Altri database variano ampiamente a questo proposito.)

Più precisamente, si dovrebbe dire che TIMESTAMP SENZA FUSO ORARIO memorizza i valori di data e ora senza fuso orario. Ma senza alcun riferimento temporale, chiunque guardi quei dati dovrebbe presumere (speranza, per favore?) Che i valori siano UTC. Ma ancora una volta, discutibile perché non dovresti quasi mai usare questo tipo.

Leggi il documento attentamente e sperimenta un po' per chiarire la tua comprensione.

Non zonato

Se vuoi memorizzare l'idea generale di un tempo possibile piuttosto che di un momento specifico, usa l'altro tipo, TIMESTAMP WITHOUT TIME ZONE .

Ad esempio, il Natale inizia quest'anno al primo momento del 25 dicembre 2017. Sarebbe 2017-12-25T 00:00:00 senza indicatore di fuso orario né offset da UTC. Questo valore è solo una vaga idea di possibili momenti. Non ha significato finché non applichiamo un fuso orario (o offset). Quindi lo memorizziamo usando TIMESTAMP WITHOUT TIME ZONE .

Gli elfi che lavorano nel reparto logistico per eventi speciali di Babbo Natale applicare i fusi orari come parte del loro processo di pianificazione. Il primo fuso orario è attualmente Pacific/Kiribati , 14 ore prima dell'ora UTC. Gli elfi programmano il primo arrivo di Babbo Natale lì. Gli elfi programmano un piano di volo che porti le renne in altri fusi orari in cui la mezzanotte arriva poco dopo, come Pacific/Auckland . Continuano ad andare verso ovest quando arriva la mezzanotte di ogni zona. Ore dopo in Asia/Kolkata , ancora più tardi in Europe/Paris , ancora più ore dopo in America/Montreal e così via.

Ciascuno di questi momenti di consegna specifici sarebbe stato registrato dagli elfi utilizzando WITH TIME ZONE , mentre quell'idea generale del Natale verrebbe archiviata come WITHOUT TIME ZONE .

Un altro utilizzo nelle app aziendali per WITHOUT TIME ZONE sta programmando appuntamenti a distanza di diverse settimane. I politici di tutto il mondo hanno un'inspiegabile predilezione per pasticciare con l'orologio e ridefinire le regole del fuso orario. Entrano nell'ora legale (DST), lasciano l'ora legale, iniziano l'ora legale in una data diversa o terminano l'ora legale in una data diversa o spostano l'orologio di 15 minuti o mezz'ora. Tutto ciò è stato fatto negli ultimi anni da Turchia, Stati Uniti, Russia, Venezuela e altri.

I politici spesso apportano questi cambiamenti con poco preavviso. Quindi, se stai programmando un appuntamento dal dentista per sei mesi alle 13:00, probabilmente dovrebbe essere memorizzato come TIMESTAMP WITHOUT TIME ZONE o altrimenti i politici potrebbero effettivamente cambiare l'appuntamento a mezzogiorno, o alle 14 o alle 13:30.