【问题标题】:Rails daylight savings issue while searching搜索时出现 Rails 夏令时问题
【发布时间】:2013-09-07 02:16:28
【问题描述】:

我正在搜索用户模型中的记录。搜索属性from_date,to_date将用于根据created_at列搜索用户模型中的记录。

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) 之间,只返回前两条记录。最后一个没有被退回。当我将 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)

查询有什么问题?我认为它存在日光时区问题。

【问题讨论】:

  • 您需要将 created_at 列转换为 Date,它实际上是 DateTime ;)
  • 实际生成的 SQL 是什么?我的猜测是你在 Rails 和你的数据库之间遇到了时区转换。
  • @PhilipHallstrom 它产生以下 sql:SELECT users.* FROM users WHERE (users.created_at >= '2013-09-04' AND users.@ 987654329@
  • @PeterAlfvin 对不起,我更新了这个问题。它们属于 Date 类
  • @PeterAlfvin :在yoshiji指出之后我更新了sql。

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

您需要将 created_at 字段转换为日期:

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 ) }

【讨论】:

  • 工作就像一个魅力。非常感谢。
  • 也许我今天过得很糟糕,但我不明白为什么原始 SQL(具有
猜你喜欢
  • 2020-12-01
  • 2017-03-14
  • 2013-11-15
  • 2012-03-25
  • 2015-06-07
  • 2011-11-20
  • 2011-11-20
  • 2013-02-19
  • 2013-01-30
相关资源
最近更新 更多