我在表“没有时区的时间戳”中有一个时间字段 . 将记录保存到数据库时,与当地时间相比,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 回答
假设您的记录带有特定UTC偏移的时间戳,您可以尝试将UTC格式的相关日期的开始和结束时间传递给您的查询:
Explanation :
midnight是
Time
实例上的Rails方法,它返回Time
对象,该对象表示原始Time
对象日期的午夜 . 同样,record.time.midnight + 1.day
返回代表第二天午夜的Time
对象 . 然后,将两个Time
对象(可能在标准UTC偏移中加上时间戳)转换为UTC,以UTC格式(UTC时间为 not 午夜)创建表示系统时区的午夜到午夜的时间段,这正是您的'重新寻求查询 .怎么样
result = transmissions.joins(:report).where('reports.time >= ? AND reports.time <= ?', record.time.beginning_of_day.utc, record.time.end_of_day.utc)
.utc
部分可能没有必要 .