2013-02-20 33 views
0

我在中央時區的服務器上安裝了postgres數據庫,因此所有時間戳列均位於中央時區。如何將postgres數據庫從CST轉換爲GMT?

有沒有辦法在postgres中將CST中的所有時區列從CST更改爲GMT?將數據庫配置爲使用GMT最佳做法是什麼?

+0

在'postgresql.conf'中,有一個時區設置。所以,你可以做到以下幾點.'timezone ='GMT''。 – fbynite 2013-02-20 09:29:20

回答

1

好,最好的做法是避免使用TIMESTAMP型不知道什麼時區和總是使用TIMESTAMPTZ(簡稱TIMESTAMP WITH TIME ZONE)類型來存儲您的時間戳。

TIMESTAMPTZ同時存儲時間戳UTC和時區,其中時間戳最初寫入(如CST,或GMT+6)。這樣,無論當前的服務器或客戶端時區設置如何,您都可以正確操作和顯示這些列。

您應該能夠使用像到現有的TIMESTAMP列轉換成TIMESTAMPTZ:

ALTER TABLE mytable ALTER COLUMN old_tstamp TYPE TIMESTAMPTZ 

在此之前,你應該嘗試對從TIMESTAMP到TIMESTAMPTZ轉換多麼小數據集或也許小的測試表真正爲你工作,以便您的數據保存時區信息。對於當前會話

如果轉換工作不正常,你可以臨時設置時區using語句一樣(ALTER TABLE ... COLUMN ... TYPE前使用)(你需要它只是轉換用途):

SET timezone TO 'CST6CDT'; 

SET timezone TO 'UTC+6'; 

這會影響後續操作和從TIMESTAMPTIMESTAMPTZ的轉換 - 只要確保正確無誤。

在您轉換所有時間戳到TIMESTAMPTZ,服務器或客戶機的時區設置(默認爲當前操作系統時區設定)僅用於顯示目的是有用的,因爲數據操作將總是正確的。

+0

我所有的ts時間實際上已經創建了時區,我使用的是一個域來創建它們,並且並沒有真正瞭解帶有時區的更精細的點。看起來我除了在服務器上更改時間外沒有其他要做的事情。 「 – ams 2013-02-21 09:34:47

+0

」TIMESTAMPTZ存儲時間戳以UTC和時區最初寫入的時區(如CST,PST或GMT + 6)。「 - 這是不正確的,「對於帶時區的時間戳,內部存儲的值始終是UTC」[「8.5.1.3。Time Stamps」](http://www.postgresql.org/docs/current/static/datatype- datetime.html#AEN5739)。 – 2013-02-23 01:14:30

相關問題