Ruby on rails 搜索时Rails夏令时问题

Ruby on rails 搜索时Rails夏令时问题,ruby-on-rails,ruby,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3.2,我正在用户模型中搜索记录。从_date到_date的搜索属性将用于根据在列中创建的_在用户模型中搜索记录 User model : (id, name, created_at) 我在数据库中有以下记录 id, name, created_at 1 jd1 2013-09-04 18:01:57 2 jd2 2013-09-05 19:01:57 3 jd3 2013-09-05 23:01:57 当我搜索时,在“2013-09-04.”to_date(fr

我正在用户模型中搜索记录。从_date到_date的搜索属性将用于根据在列中创建的_在用户模型中搜索记录

User model : (id, name, created_at)
我在数据库中有以下记录

id, name, created_at
 1   jd1    2013-09-04 18:01:57
 2   jd2    2013-09-05 19:01:57
 3   jd3    2013-09-05 23:01:57
当我搜索时,在“2013-09-04.”to_date(from_date)和“2013-09-05.”to_date(to_date)之间,只返回前两条记录。最后一个不会被退回。当我将截止日期更改为“2013-09-06”时,将显示最后一条记录。这是我使用的查询

date_range = from_date ... to_date + 1.day
scope :by_date, ->(date_range) {where(created_at: date_range)}

User.by_date(date_range)

这个查询有什么问题?我认为它有昼间时区的问题

您需要将创建的_在字段中强制转换为日期:

CAST(users.created_at AS DATE)
在where条款中:

where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date1, date2 )
在您的情况下,在您的范围内:

scope :by_date, lambda{ |date_range| where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date_range.min, date_range.max ) }
希望这有帮助


奖励:CAST的短版本,与PostGre SQL配合使用:

scope :by_date, lambda{ |date_range| where("users.created_at::date BETWEEN ? AND ?", date_range.min, date_range.max ) }

您需要将您在字段中创建的_转换为日期:

CAST(users.created_at AS DATE)
在where条款中:

where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date1, date2 )
在您的情况下,在您的范围内:

scope :by_date, lambda{ |date_range| where("CAST(users.created_at AS DATE) BETWEEN ? AND ?", date_range.min, date_range.max ) }
希望这有帮助


奖励:CAST的短版本,与PostGre SQL配合使用:

scope :by_date, lambda{ |date_range| where("users.created_at::date BETWEEN ? AND ?", date_range.min, date_range.max ) }

您需要将创建的_at列强制转换为日期,它实际上是一个DateTime;)实际生成的SQL是什么?我猜你正在运行Rails和数据库之间的时区转换。@PhilipHallstrom它生成以下sql:SELECT
users
*FROM
users
WHERE(
users
created\u at
=“2013-09-04”和
users
created\u at
<2013-09-06'))@PeterAlfvin很抱歉,我更新了问题。它们已经过时了class@PeterAlfvin:我在yoshiji指出后更新了sql。您需要将创建的_at列转换为日期,它实际上是日期时间;)实际生成的SQL是什么?我猜你正在运行Rails和数据库之间的时区转换。@PhilipHallstrom它生成以下sql:SELECT
users
*FROM
users
WHERE(
users
created\u at
=“2013-09-04”和
users
created\u at
<2013-09-06'))@PeterAlfvin很抱歉,我更新了问题。它们已经过时了class@PeterAlfvin:在yoshiji指出后,我更新了sql。工作很有魅力。非常感谢。也许我今天过得不好,但我不明白为什么原始SQL(具有<'.-06')不起作用,除非这确实是一个时区问题,并且所讨论的日期显示的是本地时间,但实际上是UTC的“第二天”,并且在演员阵容中以某种方式变为“前一天”。原始的SQL在我的环境中当然可以工作。工作起来很有魅力。非常感谢。也许我今天过得不好,但我不明白为什么原始SQL(具有<'.-06')不起作用,除非这确实是一个时区问题,并且所讨论的日期显示的是本地时间,但实际上是UTC的“第二天”,并且在演员阵容中以某种方式变为“前一天”。最初的SQL当然可以在我的环境中工作。