2012-04-30 18 views
5

私たちはカヤッカーがストリームをパドルするのに十分な水があるかどうかを知り、時間を浪費しないように独自のストリームゲージ(このUSGSゲージとよく似ています)を展開しています。そこに追い出されるガス。私たちは、東部および中央部の時間帯にまたがる南東部のホワイトウォーター地域にこれらのいくつかを設置したいと考えています。PostgreSQLでの夏時間のタイムゾーン

私はレコードが挿入されている時間を、そのレコードのcurrent_timeのデフォルト値を使用して保存しています。後でMM/DD/YYYY HH12:MI AM TZ形式を使用してデータを表示すると、03/12/2012 01:00 AM CDTのように表示されます。私は出力が日中の節約時間の変化を知るようにしたいので、前の文の最後の部分はCSTとCDTの間で変化します。この変更は2012年3月11日に発生しました。このDSTラインの両側に日付が含まれています。私は開発のために私のWindows 7のラップトップを使用しています。私たちは後でUnixボックスに展開します。 Postgresは私のWindowsコンピュータが米国東部時間帯に設定されていることを明らかにしています。私はこれをタイムゾーンなしのタイムスタンプフィールドとタイムゾーン付きタイムスタンプフィールドで試していますが、動作させることはできません。

私は選択した時点で「タイムゾーン」を使用しようとしましたが、タイムゾーンを表示するまではすべて動作しています。実際の時間はタイムスタンプの一部で、CDTの時刻を尋ねると1時間だけ正しく減算されます。しかしEDTが出力に表示されます。

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" 

私たちのゲージのそれぞれが位置するタイムゾーンをキャラクタ可変フィールドに別のテーブルとして保存しています。私は時間の出力の終わりにこの値を追加することを検討しましたが、私の介入なしにそれをCSTからCDTに変更したいと思います。

ありがとうございました。

+1

ここで、 'psql'の' \ d readings2'の出力を投稿できると便利です。 – vyegorov

答えて

15

CDTやCSTなどのタイムゾーン名を使用する代わりに、full Olsen-style time zone namesを使用することもできます。中央時間の場合は、タイムゾーンを選択できます。 America/Chicagoなどの現在地に一致するもの、またはUS/Centralなどのいずれかです。これにより、PostgreSQLがOlsen tzデータベースを使用して、指定された日付に夏時間が適用されるかどうかが自動的に把握されます。

5

確かにTIMESTAMP WITH TIME ZONE列(PostgreSQLではtimestamptzとも呼ばれます)が必要です。タイムスタンプはUTCで保存されるため、特定の瞬間を表します。名前の通り、ではなく、AT TIME ZONEというフレーズで、選択したタイムゾーンで取得したタイムスタンプを表示できます。

TIMESTAMP WITH TIME ZONEのセマンティクスは混乱しており、ほとんど役に立たない。私は強くあなたが記述しているもののためにそのタイプを使用しないことを強くお勧めします。

私は実際にCHARACTER VARYING列にタイムスタンプを格納することについて話し合う質問の部分で混乱します。それは問題の一部であるかのように見えます。あなたが最初からtimestamptzにそれを保存することができれば、私はあなたがより少ない問題を有すると思う。 UTCからのオフセットに-04表記を使用することが最も安全です。しかし、それは私にとってもっと有益な仕事のようです。

+1

あなたの答えを追加するには、こちらをもっと深く扱うリンク:http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ – jgburet

関連する問題