Rails 4:GROUP BY日期与时区

时间:2016-04-13 03:24:41

标签: ruby-on-rails

我试图将每天削减的LaserSheets数量用于图表中。

pages_controller.rb:

start_date = 7.days.ago
recent_cut_stats = LaserSheet.where('cut_at IS NOT NULL')
                             .where('cut_at > ?', start_date.beginning_of_day)
                             .group("DATE(cut_at)")
                             .count

我遇到问题,因为我的网站的其余部分使用application.rb中设置的时区,但上述查询返回按UTC时间按日期分组的结果。在太平洋时间下午5点(UTC -0700)之后,我开始看到明天的结果。有没有办法将group("Date(cut_at)"转换为应用程序的时区?

2 个答案:

答案 0 :(得分:1)

如上面的评论所示,您需要使用SQL将您的本机数据库转换为日期:

start_date = 7.days.ago
recent_cut_stats = LaserSheet.where('cut_at IS NOT NULL')
                             .where('cut_at > ?', start_date.beginning_of_day)
                             .group("DATE(CONVERT_TZ(cut_at, 'UTC','<name of time zone>'))")
                             .count

请参阅https://en.wikipedia.org/wiki/List_of_tz_database_time_zones以获取数据库时区列表。

对于.where('cut_at > ?', start_date.beginning_of_day)语句,请确保在Rails中正确设置了您的时区:

application.rb中的

config.time_zone  = '<name of time zone>'

答案 1 :(得分:0)

.group("DATE(created_at at time zone 'utc' at time zone 'Europe/Amsterdam')").count

时区名称: https://popsql.com/learn-sql/postgresql/how-to-convert-utc-to-local-time-zone-in-postgresql/