Ruby on rails 带有Date.day的查询返回两天

Ruby on rails 带有Date.day的查询返回两天,ruby-on-rails,sqlite,Ruby On Rails,Sqlite,问题是,下面的查询返回两个日期的项目,就好像今天/现在覆盖了两天,而此查询只应返回一天的项目: 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')) =&g

问题是,下面的查询返回两个日期的项目,就好像
今天
/
现在
覆盖了两天,而此查询只应返回一天的项目:

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
返回的值完全相同。这可能与我所在的UTC+1时区有关:

[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
Time.now
等于
Time.now.localtime
,因为我在
config/application.rb
中将activerecord设置为本地时间的时间戳:

config.active_record.default_timezone = :local
这是开发环境中本地机器上的一个db,使用sqlite3和rails 4.1.7

那么问题出在哪里? 您已将默认时区设置为本地,因此您将从数据库中获得与您的时区相关的答案,因为

Mon, 29 Dec 2014 23:15:19 UTC +00:00

位于您的
UTC+1
时区的同一天(
2014年12月30日星期二

默认情况下,时间戳始终以UTC为单位。 如果您100%确定您的应用程序将仅在一个时区内使用,并且确实要重新定义默认值,请转到以下答案:

否则,如果您使用active_record,最好将日期与其自身进行比较,而不是使用普通SQL。

那么问题出在哪里? 您已将默认时区设置为本地,因此您将从数据库中获得与您的时区相关的答案,因为

Mon, 29 Dec 2014 23:15:19 UTC +00:00

位于您的
UTC+1
时区的同一天(
2014年12月30日星期二

默认情况下,时间戳始终以UTC为单位。 如果您100%确定您的应用程序将仅在一个时区内使用,并且确实要重新定义默认值,请转到以下答案:


否则,如果您使用active_record,最好将日期与其自身进行比较,而不是使用普通SQL。

而不是返回
tickets
表(
tickets.*
)的所有相关列,然后用
映射(&:created_at)将它们剥离
您最好使用
弹拨
,如:

Ticket.where("DATE(created_at) = DATE(?)", Time.now.localtime.to_date).pluck(:created_at)
这样一来,数据库就完成了所有的工作(它知道如何做好),而您不会带回所有额外的数据


查看有关
pickets.
的更多信息,而不是返回
tickets
表(
tickets.
)的所有相关列,然后使用
map(&:created_at)
将它们剥离下来。您最好使用
pickets
,如:

Ticket.where("DATE(created_at) = DATE(?)", Time.now.localtime.to_date).pluck(:created_at)
这样一来,数据库就完成了所有的工作(它知道如何做好),而您不会带回所有额外的数据


请参阅有关Pull的更多信息:
Ticket.where(“DATE(created_-at)=DATE(?),“2014-12-30”).map(&:created_-at)。map(&:localtime)
仅返回“2014-12-30”。但是,给定了
config
,时间戳不也应该在本地时间创建吗?如何实现这一点?没错:
Ticket.where(“DATE(created_-at)=DATE(?),“2014-12-30”).map(&:created_-at).map(&:localtime)
仅返回“2014-12-30”。但是,给定了
config
,时间戳不也应该在本地时间创建吗?如何做到这一点?