web-dev-qa-db-fra.com

Date et heure en UTC - comment les stocker dans des postgres?

Je reçois mes données: date et heure en UTC, dans un format de fichier csv dans des colonnes séparées. Étant donné que je devrai convertir cette zone en date et heure de l'endroit où je vis, actuellement en été en UTC + 2, et peut-être d'autres zones, je me demandais quelle est la meilleure pratique pour insérer des données dans des postgres lorsque nous parlons de type de données. Dois-je placer mes deux données dans une seule colonne ou les garder séparées en tant que types: date et heure, et sinon, dois-je utiliser timestamp ou timestampz (ou autre chose).

11
mycupoftea

utilisez timestamptz il stockera votre horodatage en UTC. et l'affichera au client en fonction de ses paramètres régionaux.

https://www.postgresql.org/docs/current/static/datatype-datetime.html

Pour l'horodatage avec le fuseau horaire, la valeur stockée en interne est toujours en UTC (Universal Coordinated Time, traditionnellement connue sous le nom de Greenwich Mean Time, GMT). Une valeur d'entrée qui a un fuseau horaire explicite spécifié est convertie en UTC en utilisant le décalage approprié pour ce fuseau horaire. Si aucun fuseau horaire n'est indiqué dans la chaîne d'entrée, il est supposé être dans le fuseau horaire indiqué par le paramètre TimeZone du système et est converti en UTC en utilisant le décalage pour le fuseau horaire.

Lorsqu'un horodatage avec une valeur de fuseau horaire est sorti, il est toujours converti de UTC en zone de fuseau horaire actuelle et affiché en tant qu'heure locale dans ce fuseau horaire. Pour voir l'heure dans un autre fuseau horaire, modifiez le fuseau horaire ou utilisez la construction AT TIME ZONE (voir la section 9.9.3).

mis à jour avec un autre bon point de Lukasz , je devais mentionner:

La colonne unique est également en faveur du fait que si vous stockez la date et l'heure dans des colonnes distinctes, vous devrez toujours les combiner et les convertir en horodatage si vous souhaitez modifier le fuseau horaire de la date.

Ne pas faire cela conduirait à la date '2017-12-31' avec l'heure '23: 01: 01 'dans un autre fuseau horaire, en fait, non seulement une heure différente, mais une date différente avec toutes les ANNÉES et MOIS et JOUR différents

une autre mise à jour Selon Laurenz remarque, n'oubliez pas les documents ci-dessus quote Une valeur d'entrée qui a un fuseau horaire explicite spécifié est convertie en UTC en utilisant le décalage approprié pour ce fuseau horaire. Ce qui signifie que vous devez gérer soigneusement les dates d'entrée. Par exemple:

t=# create table t(t timestamptz);
CREATE TABLE
t=# set timezone to 'GMT+5';
SET
t=# insert into t select '2017-01-01 00:00:00';
INSERT 0 1
t=# insert into t select '2017-01-01 00:00:00' at time zone 'UTC';
INSERT 0 1
t=# insert into t select '2017-01-01 00:00:00+02';
INSERT 0 1
t=# select * from t;
           t
------------------------
 2017-01-01 00:00:00-05
 2017-01-01 05:00:00-05
 2016-12-31 17:00:00-05
(3 rows)
16
Vao Tsun