Fuseau horaire avec l'heure d'été dans PostgreSQL

Nous déployons nos propres jauges de flux (un peu comme cette jauge USGS : http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600 ) afin que nous, les kayakistes, sachions s'il y a suffisamment d'eau pour pagayer dans le flux et ne perdez pas de temps et d'essence pour vous y rendre. Nous espérons en installer quelques-uns dans la région des eaux vives du sud-est qui s'étend sur les fuseaux horaires de l'est et du centre.

Je stocke l'heure à laquelle un enregistrement est inséré en utilisant la valeur par défaut de current_time pour l'enregistrement. J'aimerais afficher plus tard les données en utilisant le MM/DD/YYYY HH12:MI AM TZformat, qui sort comme 03/12/2012 01:00 AM CDT. J'aimerais également que la sortie soit consciente des changements d'heure d'été, de sorte que la dernière partie de la phrase précédente changerait entre CST et CDT lorsque nous "avancerons" et "retomberons". Ce changement s'est produit le 11/03/2012 cette année et j'ai inclus les dates des deux côtés de cette ligne DST ci-dessous. J'utilise mon ordinateur portable Windows 7 pour le développement et nous déploierons plus tard sur une machine Unix. Postgres a apparemment détecté que mon ordinateur Windows est réglé sur le fuseau horaire de l'est des États-Unis. J'essaie ceci avec un champ "horodatage sans fuseau horaire" et un "horodatage avec fuseau horaire"

J'ai essayé d'utiliser "au fuseau horaire" dans mes sélections et tout fonctionne jusqu'à ce qu'il soit temps d'afficher le fuseau horaire. L'heure réelle fait partie de l'horodatage est correctement soustraite d'une heure lorsque je demande l'heure dans CDT. Mais EDT est affiché dans la sortie.

SELECT reading_time as raw,
reading_time at time zone 'CDT',
to_char(reading_time at time zone 'CDT',
'MM/DD/YYYY HH12:MI AM TZ') as formatted_time
FROM readings2;
"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT"
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT"
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST"
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST"
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT"

Je stocke le fuseau horaire dans lequel chacune de nos jauges se trouve dans un champ de caractères variables dans une table séparée. J'ai envisagé d'ajouter simplement cette valeur à la fin de la sortie de temps, mais je veux qu'elle passe de CST à CDT sans mon intervention.

Merci de votre aide.


Solution du problème

Vous voulez certainement une TIMESTAMP WITH TIME ZONEcolonne (également connue sous le nom timestamptzde PostgreSQL). Cela stockera l'horodatage en UTC, de sorte qu'il représente un moment particulier dans le temps. Contrairement à ce que son nom l'indique, il n'enregistre pas de fuseau horaire dans la colonne - vous pouvez afficher l'horodatage récupéré dans le fuseau horaire de votre choix avec la AT TIME ZONEphrase.

La sémantique de TIMESTAMP WITHOUT TIME ZONE est déroutante et presque inutile. Je vous recommande fortement de ne pas utiliser ce type du tout pour ce que vous décrivez.

I'm really confused by the part of the question which talks about storing the timestamp in a CHARACTER VARYING column. That seems as though it might be part of the problem. If you can store it in timestamptz right from the start I suspect that you will have fewer problems. Barring that, it would be safest to use the -04 notation for offset from UTC; but that seems like more work to me for no benefit.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"