使用Date.today查询返回两天

时间:2014-12-30 13:18:09

标签: ruby-on-rails sqlite

问题是以下查询返回两个日期的项目,好像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的本地计算机上的数据库。

2 个答案:

答案 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

的更多信息