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 TZ
format, 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 ZONE
colonne (également connue sous le nom timestamptz
de 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 ZONE
phrase.
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
Enregistrer un commentaire