ruby-on-rails - Rails - 使用相同的属性名称按日期分组返回不同的答案

标签 ruby-on-rails postgresql datetime activerecord

date_start = Time.parse('11/08/2015').beginning_of_day
date_end = Time.parse('11/08/2015').end_of_day

created_at_day_tz = "date(created_at AT TIME ZONE \'UTC\'
                     AT TIME ZONE \'#{Time.zone.tzinfo.identifier}\')"

users = User.where("users.created_at BETWEEN ? AND ?", date_start, date_end)

按 created_at 分组为 created_at_day(仅限日期,groupped 属性的新名称)

grouped_with_timezone_day = users.group(created_at_day_tz).
  order(created_at_day_tz).
  select("#{created_at_day_tz} as created_at_day, count(*) as count")
# grouped_with_timezone_day.map {|u| [u.created_at_day, u.count] }
# => [[Tue, 11 Aug 2015, 186]]

按 created_at 分组为 created_at(仅限日期,groupped 属性的名称相同)

grouped_with_timezone = users.group(created_at_day_tz).
  order(created_at_day_tz).
  select("#{created_at_day_tz} as created_at, count(*) as count")
# grouped_with_timezone.map {|u| [u.created_at, u.count] }
# => [[Mon, 10 Aug 2015 21:00:00 BRT -03:00, 186]]

如果记录相同,为什么结果不同?为什么一个结果带有时区,如日期时间,而另一个结果仅作为日期?

activerecord 是否“转换”为带时区的 DateTime,因为 created_at 是以这种方式定义的(顺便说一句,在这种情况下,这会使日期不正确)?

最佳答案

时间戳不正确 - 也就是说,它是 2015 年 8 月 11 日午夜 UTC - 它只是以你的本地时间显示。

Rails 有点 special behavior对于 created_atupdated_at:

The timestamps macro adds two columns, created_at and updated_at. These special columns are automatically managed by Active Record if they exist.

它始终将查询返回的 created_at 视为时间戳。您的查询仅返回日期 2015-08-11,这被解释为午夜。打印时,时间戳显示在您所在地区的时区中(我推测必须是 -03:00),导致 11 日午夜前 3 小时。

当您将结果命名为 created_at_day 时,您可以避免 Rails 将其转换为时间戳并只获取您期望的日期。

关于ruby-on-rails - Rails - 使用相同的属性名称按日期分组返回不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771607/

相关文章:

ruby-on-rails - 延迟作业超时

ruby-on-rails - 是否有在 RAILS API Controller 索引操作中应用过滤器哈希的 DRY 方法?

postgresql - DBLINK vs Postgres_FDW,哪一个可以提供更好的性能?

postgresql - 对 PostgreSQL 数据库的耗时查询是重复的

mysql - 如何在数据库中存储非常旧的日期?

ruby-on-rails - 使用 redis 作为 rails 应用程序的数据库来处理大量 api 请求

MySQL,Snow Leopard 上的 RoR 问题

python - 如何在 django 测试设置中创建 postgresql 扩展

python - Pandas 过滤器日期时间 : TypeError: can't compare offset-naive and offset-aware datetimes

c# - 比较可为空的 DateTime?