2012-04-23 37 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