2012-04-30 52 views
5

我們正在部署我們自己的流量計(很像這個USGS測量儀:http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600),所以我們的皮艇知道是否有足夠的水來划槳,不浪費時間和天然氣驅出那裏。我們希望在跨越東部和中部時區的東南部白水區域安裝其中的一些。PostgreSQL夏時制時區

我使用記錄的current_time的默認值來存儲插入記錄的時間。我想稍後使用MM/DD/YYYY HH12:MI AM TZ格式顯示數據,其格式輸出如03/12/2012 01:00 AM CDT。我還希望輸出結果能夠知道日光節省時間的變化,因此當我們'前進'和'後退'時,前面句子的最後部分會在CST和CDT之間發生變化。這一變化發生在今年3月11日,我已經在下面的DST這一行的兩邊加上了日期。我正在使用我的Windows 7筆記本電腦進行開發,稍後我們將在Unix機器上進行部署。 Postgres顯然已經發現我的Windows電腦已經設置在美國東部時區。我試着用'沒有時區的時間戳'字段和'有時區的時間戳'字段,但不能讓它工作。

我試過在我的選擇中使用「時區」,並且每件事物都在工作,直到它顯示時區爲止。實際的時間是時間戳的一部分,在我請求CDT時間時正確減去一小時。但是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 WITHOUT TIME ZONE的語義令人困惑,幾乎沒用。我強烈建議你根本不要使用那種類型來描述你所描述的內容。

對於將時間戳存儲在CHARACTER VARYING列中的問題部分,我感到非常困惑。這似乎可能是問題的一部分。如果您從一開始就可以將它存儲在timestamptz中,我懷疑您的問題會更少。除此之外,使用-04表示法來抵消UTC是最安全的;但對我來說這似乎更多的工作沒有任何好處。

+1

要添加你的答案,這裏有一個處理這個更深的鏈接:http://phili.pe/posts/timestamps-and-time-zones-in-postgresql/ – jgburet