2012-04-23 55 views
4

我希望我的報告在CST中顯示,而我的數據庫是UTC。爲此,我需要能夠按時間列進行分組,並讓數據庫執行時區轉換。RoR Postgresql時區組未被Heroku工作

這工作對我開發的PostgreSQL箱:

offset = -5 
    result = ActiveRecord::Base.connection.execute("select date(srl.created_at AT TIME 
    ZONE '#{offset.to_s}') AS date, count(*) from server_request_logs srl where  
    srl.created_at between '#{@from.to_s(:db)}' and '#{@to.to_s(:db)}' group by 
    date(srl.created_at AT TIME ZONE '#{offset.to_s}')") 

在Heroku它的錯誤與:

ActiveRecord::StatementInvalid: PGError: ERROR: time zone "-5" not recognized 

它也不會TZInfo的名字,如 '美國/溫尼伯' 或支持時區,如「工作CST'從http://www.postgresql.org/docs/7.2/static/timezones.html

有沒有人能夠得到這個工作?

回答

1

首先,請確保您將時間戳列和變量定義爲TIMESTAMP WITH TIME ZONE(或簡稱爲timestamptz)。在PostgreSQL中,這實際上並不會導致任何時間戳被保存;但使其成爲一個固定的時間點,並以UTC存儲。您可以用乾淨的語義查看它的AT TIME ZONETIMESTAMP WITHOUT TIME ZONE(這是你得到的,如果你只是說TIMESTAMP)是而不是一個固定的時間點,直到它解決對時區,因此很難合作。

您引用的有關時區的文檔頁面來自已經退出支持的PostgreSQL的非常舊的版本。也許這頁將有更多的幫助到你:

http://www.postgresql.org/docs/current/interactive/datetime-config-files.html

+0

酷謝謝,我會在早上嘗試。還有一件事你如何將rails遷移類型映射到TIMESTAMP WITH TIMEZONE?我的schema.rb有:t.datetime「created_at」 t.datetime「updated_at」 – 2012-04-23 04:35:15

+0

@BradReid我正在處理類似的問題。回答這個問題。默認情況下,Rails 3將created_at列映射爲沒有時區的TIMESTAMP。如果還有其他方法可以改變默認行爲,我會保持警惕。你弄清楚什麼了嗎? – GeorgeW 2012-05-02 13:39:29

+0

@GeorgeW:如果這是默認情況下Rails 3所做的,那麼您應該將它作爲錯誤報告給維護者。對於初學者來說,當DST結束並且時鐘「倒退」時,有一個小時會重複,如果數據庫當時正在修改,可能會導致各種問題。 – kgrittn 2012-05-02 15:47:09