1

我使用下面的查询来计算按天细分的签到次数。

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

所以一定是上面查询的复杂性。我猜这可能是选择语句。我如何编写以上内容来说明配置的时区?

4

2 回答 2

4

我正在做同样的事情(尽管我按分钟分组)......使用下面的代码适合我......

Time.zone.utc_to_local(DateTime.parse(@checkin[:calendar_day]))

我对组中的每个项目执行此操作,然后将数组哈希传递给视图层。

于 2012-10-30T08:09:53.830 回答
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) }
于 2015-03-25T04:45:54.117 回答