【问题标题】:RoR Postgresql timezone group by not working on Heroku通过不在 Heroku 上工作的 RoR Postgresql 时区组
【发布时间】:2012-04-23 03:12:34
【问题描述】:

我希望我的报告以 CST 显示,而我的数据库是 UTC。为此,我需要能够按时间列分组并让数据库进行时区转换。

这适用于我的开发 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

它也不适用于诸如“America/Winnipeg”之类的 TZInfo 名称或来自http://www.postgresql.org/docs/7.2/static/timezones.html 的“CST”等受支持的时区

有人能搞定这个吗?

【问题讨论】:

    标签: ruby-on-rails postgresql group-by timezone


    【解决方案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

    【讨论】:

    • 很酷,谢谢,我会在早上尝试。还有一件事,您如何将 Rails 迁移类型映射到 TIMESTAMP WITH TIMEZONE?我的 schema.rb 有: t.datetime "created_at" t.datetime "updated_at"
    • @BradReid 我正在解决类似的问题。投票赞成这个问题。默认情况下,Rails 3 将 created_at 列映射为没有时区的 TIMESTAMP。如果有其他方法可以做到这一点,我会警惕改变默认行为。你有什么发现吗?
    • @GeorgeW:如果 Rails 3 默认这样做,您应该将其作为错误报告给维护人员。对于初学者来说,当夏令时结束并且时钟“倒退”时,会有一个小时会重复,如果当时正在修改数据库,这可能会导致各种问题。
    猜你喜欢
    • 2021-11-16
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2015-04-03
    • 2021-12-28
    • 2017-07-15
    相关资源
    最近更新 更多