Non ci sono soluzioni antiproiettile qui.
Il mio primo consiglio:non fare mai affidamento sul fuso orario predefinito del server.
Il mio secondo consiglio:scegli tra timestamp
-timestamptz
secondo la semantica (prevalente) dei dati.
Più in dettaglio:PostgresSQL ha due varianti di timestamp, denominate in modo confuso TIMESTAMP WITHOUT TIMEZONE (timestamp)
e TIMESTAMP WITH TIMEZONE (timestamptz)
. In realtà, nessuno dei due memorizza un fuso orario e nemmeno un offset. Entrambi i tipi di dati occupano la stessa larghezza (4 byte) e la loro differenza è sottile e, peggio, possono morderti se non li comprendi completamente e il tuo server cambia il fuso orario. Il mio set di regole di sanità mentale è:
-
Usa
TIMESTAMP WITH TIMEZONE (timestamptz)
per la memorizzazione di eventi prevalentemente correlati al tempo "fisico" , per il quale sei principalmente interessato a chiedere seevent 1
era prima dell'event 2
(indipendentemente dai fusi orari) o calcolando gli intervalli di tempo (in "unità fisiche", ad esempio secondi; non in unità "civili" come giorni-mesi, ecc.). L'esempio tipico è il tempo di creazione/modifica del record, ciò che di solito si intende con la parola "Timestamp ". -
Usa
TIMESTAMP WITHOUT TIMEZONE (timestamp)
per la memorizzazione di eventi per i quali l'informazione rilevante è il "orario civile" (ovvero i campi{year-month-day hour-min-sec}
nel suo insieme) e le query coinvolgono calcoli di calendario. In questo caso, memorizzeresti qui solo l'"ora locale", ovvero la data e l'ora relativa a un fuso orario non specificato (irrilevante, implicito o memorizzato da qualche altra parte).
La seconda opzione ti semplifica la ricerca, ad esempio, di "tutti gli eventi che si sono verificati il giorno '20-01-2013'" (in ogni regione/paese/fuso orario corrispondente), ma rende più difficile la ricerca di "tutti gli eventi che verificato (fisicamente) prima di un evento di riferimento" (a meno che non sappiamo che si trovano nello stesso fuso orario). Scegli tu.
Se hai bisogno dell'intera cosa, nessuno dei due è sufficiente, devi memorizzare il fuso orario o l'offset in un campo aggiuntivo. Un'altra opzione, che spreca alcuni byte ma può essere più efficiente per le query, è memorizzare entrambi i campi.
Vedi anche questa risposta .