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(仅限日期,分组属性的新名称)
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(仅限日期,分组属性的名称相同)
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]]
如果记录相同,为什么结果会有所不同?为什么一个结果带有时区,如DateTime,另一个带有Date?
对于带时区的DateTime,activerecord'cast'是否正在'施放',因为created_at是这样定义的(顺便说一下,这会使日期不正确)?
答案 0 :(得分:1)
时间戳不正确 - 也就是说,它是在UTC时间的2015-08-11 - 它只是在您当地时间显示。
Rails对created_at
和updated_at
有点special behavior:
timestamps macro
添加了两列,created_at
和updated_at
。这些特殊列由Active Record自动管理(如果存在)。
它始终将来自查询的created_at
视为时间戳。您的查询只返回日期2015-08-11
,该日期被解释为午夜。打印时,时间戳显示在您所在区域的时区(我认为必须为-03:00
),从而导致11日午夜前3小时。
当您将结果命名为created_at_day
时,您可以避免Rails将其转换为时间戳并获得您期望的日期。