首页 文章

rails group by utc date

提问于
浏览
1

我在表“没有时区的时间戳”中有一个时间字段 . 将记录保存到数据库时,与当地时间相比,utc时间可能是不同的一天 . 但是,我需要按日期对记录进行分组 . 因此,我正在做这样的事情:

result = transmissions.joins(:report).where('reports.time::timestamp::date = ?', record.time.to_date)

问题是如果utc日期与当地时间不同,那么该记录不包含在结果中 . 任何想法如何获得正确的结果?

显然我不能改变“没有时区”:

Rails database-specific data type

它说:“得出结论,模式迁移中的默认ActiveRecord日期时间和时间戳列类型无法修改,以迫使PostgreSQL使用带时区的时间戳 . ”

所以我不知道如何按日期分组,因为显然这样的事情是错误的:

Unit.where(id: 1100).first.reports.order("DATE(time)").group("DATE(time)").count
 => {"2013-12-14"=>19, "2013-12-15"=>5}

返回值完全错误 . 所有25条记录应在2013-12-14上,0条记录在2013-12-15 .

2 回答

  • 1

    假设您的记录带有特定UTC偏移的时间戳,您可以尝试将UTC格式的相关日期的开始和结束时间传递给您的查询:

    result = transmissions.joins(:report).where('reports.time >= ? AND reports.time < ?', record.time.midnight.utc, (record.time.midnight + 1.day).utc)
    

    Explanation

    midnightTime 实例上的Rails方法,它返回 Time 对象,该对象表示原始 Time 对象日期的午夜 . 同样, record.time.midnight + 1.day 返回代表第二天午夜的 Time 对象 . 然后,将两个 Time 对象(可能在标准UTC偏移中加上时间戳)转换为UTC,以UTC格式(UTC时间为 not 午夜)创建表示系统时区的午夜到午夜的时间段,这正是您的'重新寻求查询 .

  • 0

    怎么样 result = transmissions.joins(:report).where('reports.time >= ? AND reports.time <= ?', record.time.beginning_of_day.utc, record.time.end_of_day.utc)

    .utc 部分可能没有必要 .

相关问题