问题是以下查询返回两个日期的项目,好像today
/ now
覆盖了两天,而只有一天的项目应该返回此查询:
Ticket.where("DATE(created_at) = DATE(?)", Time.now.localtime.to_date).map(&:created_at)
CACHE (0.0ms) SELECT "tickets".* FROM "tickets" WHERE (DATE(created_at) = DATE('2014-12-30'))
=> [Mon, 29 Dec 2014 23:15:19 UTC +00:00,
Mon, 29 Dec 2014 23:17:48 UTC +00:00,
Mon, 29 Dec 2014 23:18:23 UTC +00:00,
Mon, 29 Dec 2014 23:18:28 UTC +00:00,
Mon, 29 Dec 2014 23:19:14 UTC +00:00,
Mon, 29 Dec 2014 23:20:08 UTC +00:00,
Tue, 30 Dec 2014 00:11:44 UTC +00:00,
Tue, 30 Dec 2014 00:12:12 UTC +00:00,
Tue, 30 Dec 2014 00:14:15 UTC +00:00,
Tue, 30 Dec 2014 00:15:35 UTC +00:00]
在上面的查询中,Time.now.localtime.to_date
返回的内容与Time.now.to_date
完全相同,而Date.today
则与[50] pry(#)> Time.now
=> 2014-12-30 14:03:18 +0100
[51] pry(#)> Time.now.localtime
=> 2014-12-30 14:03:47 +0100
[52] pry(#)> Time.now.localtime.utc
=> 2014-12-30 13:03:52 UTC
完全相同。这可能是相关的,因为我在UTC + 1时区:
Time.now
Time.now.localtime
等于config/application.rb
,因为我已使用config.active_record.default_timezone = :local
中的此代码将当地时间的活动记录设置为时间戳:
{{1}}
这是我在开发环境中使用sqlite3和rails 4.1.7的本地计算机上的数据库。
答案 0 :(得分:3)
那么问题是什么? 您已将默认时区设置为本地,因此您将从数据库中获得与您的时区相关的答案,因为
Mon, 29 Dec 2014 23:15:19 UTC +00:00
和
Tue, 30 Dec 2014 00:15:35 UTC +00:00
位于Tue, 30 Dec 2014
时区的相同 日(UTC+1
)
默认情况下,时间戳始终为UTC。 如果您100%确定您的应用程序仅在一个时区使用,并且您确实想要重新定义默认值,请转到以下答案:https://stackoverflow.com/a/15306358/3310560
否则,如果您使用active_record,最好将日期与自己进行比较,而不是使用vanilla SQL。
答案 1 :(得分:1)
不是将tickets
表格的所有相关列(tickets.*
)带回来,而是使用map(&:created_at)
删除它们,而不是使用pluck
更好:
Ticket.where("DATE(created_at) = DATE(?)", Time.now.localtime.to_date).pluck(:created_at)
这样一来,DB最终会完成所有的工作(它知道如何做得好)并且你没有带回所有额外的数据。
查看有关pluck
here