我使用下面的查询来计算按日分解的支票数。
Checkin.select("date(created_at) as calendar_day, count(*) as total_checkins").where("user_id = ? AND created_at > ?", user.id, 28.days.ago).group("date(created_at)").order("date(created_at)")
示例输出:
我面临的问题是此查询是UTC格式,并且不会转换为我在config.time_zone下的application.rb文件中设置的Time.zone(PST)。在上面的示例中,最后两个签到名应位于“2012-07-30”。
我知道,对于其他查询,此转换工作正常。例如:
Checkin.last.created_at # Returns in PST
因此,必须考虑上述查询的复杂性。我猜它可能是select语句。如何编写以上内容以说明配置的时区?
答案 0 :(得分:4)
我正在做同样的事情(虽然我按分钟分组)...使用下面的代码对我来说很合适......
Time.zone.utc_to_local(DateTime.parse(@checkin[:calendar_day]))
我为组中的每个项执行此操作,然后将数组哈希传递给视图层。
答案 1 :(得分:0)
我遇到了同样的问题,试图按天分组活动(这是一个高图图表)。我本来希望做这样的事情:
# Didn't work
counts = Event.where(:created_at => start_date..end_date.end_of_day)
.group("DATE(created_at)").count
return (start_date..end_date).map{ |d| counts[d] }
但是start_date和end_date在我的本地时区,而DATE函数是UTC。相反,我在Ruby中做到了这一点。
counts = Event.where(:created_at => start_date..end_date.end_of_day)
.pluck(:id, :created_at)
.group_by{|obj| obj[1].to_date}
return (start_date..end_date).map{ |d| counts[d].try(:size) }