RubyOnRails - 按日期在数据库中搜索

时间:2013-06-19 12:54:27

标签: ruby-on-rails ruby timestamp

我在我的数据库中有一个属性,我保存记录创建日期。 保存的日期采用以下格式:

2013/06/18 19:03:24

我只需要搜索日期,我对时间不感兴趣

我尝试过这种模式,但它不起作用:

Report.find_all_by_created_at("2013-06-18").each do |r|  %> 
  [...]
 end 

5 个答案:

答案 0 :(得分:2)

鉴于created_at是一个Rails生成列,你不能真正只为在日期创建。原因在于数据库created_at被保存为时间戳(或日期时间),因此在6月18日创建的记录可能具有从2013-06-18 00:00:002013-06-18 23:59:59的值。

因此,如果您想选择在特定日期创建的所有对象,您应该执行类似

的操作
Report.where('created_at >= ? AND created_at <= ?, Date.new(2013,6,18).beginning_of_day, Date.new(2013,6,18).end_of_day)

答案 1 :(得分:1)

您可以将范围传递到以下位置:

date = Date.new(2013,6,18)
Report.where(created_at: date.beginning_of_day..date.end_of_day)

这会创建一个SQL语句,如:

SELECT `reports`.* FROM `reports` WHERE `reports`.`created_at` BETWEEN '2013-06-18  00:00:00' AND '2013-06-18 23:59:59'

答案 2 :(得分:0)

可能不是最好的解决方案,但你可以做到:

Report.where("created_at >= ? and created_at < ?","2013-06-18","2013,06-19").each do |r|
  [...]
end

答案 3 :(得分:0)

看起来您正在将其作为DateTime收集,并且您可能可以使用to_date()方法将其更改为可以搜索的Date对象。

http://api.rubyonrails.org/classes/DateTime.html#method-i-to_date

答案 4 :(得分:0)

你可以在sql查询中使用匹配器

Report.where("created_at LIKE '2013-06-18%'")

或者查看Squeel gem,它可以像ruby一样调用SQL函数语法,然后你可以使用thati生成查询的东西

WHERE cast(created_at as date) = '2013-06-18'