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

PostgreSQL/JDBC et TIMESTAMP contre TIMESTAMPTZ

Utiliser généralement TIMESTAMPTZ

Voici les conseils de David E. Wheeler, un expert Postgres, dans un article de blog dont le titre en dit long :
Toujours utiliser TIMESTAMP WITH TIME ZONE (TIMESTAMPTZ)

Si vous suivez des moments réels, des points spécifiques sur la chronologie, utilisez TIMESTAMP WITH TIME ZONE .

Une exception :le partitionnement

La seule exception de Wheeler concerne le partitionnement sur les horodatages, en raison de limitations techniques. Une exception rare pour la plupart d'entre nous.

Pour plus d'informations sur le partitionnement, consultez la doc et voir le Wiki .

Fausse appellation

Les noms de types de données timestamp with time zone et timestamp without time zone sont des noms impropres. Dans les deux cas, la valeur date-heure est stockée en UTC (pas de décalage de fuseau horaire). Relisez cette phrase précédente. UTC, toujours. La phrase "avec fuseau horaire" signifie "avec une attention portée au fuseau horaire", et non "stocker le fuseau horaire à côté de cette valeur". La différence entre les types est de savoir si un fuseau horaire doit être appliqué lors du stockage (INSERT ou UPDATE) ou de la récupération (requête SELECT). (Ce comportement est décrit pour Postgres -- Les autres bases de données varient largement à cet égard.)

Plus précisément, on devrait dire que TIMESTAMP WITHOUT TIME ZONE stocke des valeurs date-heure sans fuseau horaire. Mais sans aucune référence de période, quiconque regarde ces données devrait supposer (espérer, prier ?) que les valeurs sont UTC. Mais encore une fois, inutile car vous ne devriez presque jamais utiliser ce type.

Lire la doc attentivement et expérimentez un peu pour clarifier votre compréhension.

Hors zone

Si vous souhaitez stocker l'idée générale d'une heure possible plutôt qu'un moment spécifique, utilisez l'autre type, TIMESTAMP WITHOUT TIME ZONE .

Par exemple, Noël commence cette année au premier moment du 25 décembre 2017. Ce serait 2017-12-25T 00:00:00 sans indicateur de fuseau horaire ni décalage par rapport à UTC. Cette valeur n'est qu'une vague idée des moments possibles. Cela n'a aucun sens tant que nous n'appliquons pas un fuseau horaire (ou un décalage). Nous stockons donc cela en utilisant TIMESTAMP WITHOUT TIME ZONE .

Les lutins du service logistique des événements spéciaux du Père Noël appliquer les fuseaux horaires dans le cadre de leur processus de planification. Le premier fuseau horaire est actuellement Pacific/Kiribati , 14 heures d'avance sur UTC. Les elfes planifient la première arrivée du Père Noël là-bas. Les elfes planifient un plan de vol emmenant les rennes vers d'autres fuseaux horaires où minuit arrive peu après, comme Pacific/Auckland . Ils continuent d'aller vers l'ouest à l'arrivée de minuit de chaque zone. Quelques heures plus tard en Asia/Kolkata , encore plus tard en Europe/Paris , encore plus d'heures plus tard en America/Montreal etc.

Chacun de ces moments de livraison spécifiques serait enregistré par les elfes en utilisant WITH TIME ZONE , tandis que cette idée générale de Noël serait stockée sous la forme WITHOUT TIME ZONE .

Une autre utilisation dans les applications professionnelles pour WITHOUT TIME ZONE prend des rendez-vous plus loin que plusieurs semaines. Les politiciens du monde entier ont une prédilection inexplicable pour jouer avec l'horloge et redéfinir les règles de fuseau horaire. Ils rejoignent l'heure d'été (DST), quittent l'heure d'été, commencent l'heure d'été à une date différente ou terminent l'heure d'été à une date différente, ou décalent leurs horloges de 15 minutes ou d'une demi-heure. Tout cela a été fait au cours des dernières années par la Turquie, les États-Unis, la Russie, le Venezuela et d'autres.

Les politiciens procèdent souvent à ces changements avec peu d'avertissement. Donc, si vous planifiez un rendez-vous chez le dentiste pendant six mois à 13h00, cela devrait probablement être stocké en tant que TIMESTAMP WITHOUT TIME ZONE ou sinon les politiciens peuvent effectivement changer votre rendez-vous à midi, ou 14h00, ou 13h30.