Rails ActiveRecord按日期查找/搜索

时间:2012-11-03 17:57:03

标签: activerecord ruby-on-rails-3.2

我试图通过'created_at'日期查找记录 - 数据库列类型是'datetime'和 我正在使用jQuery的UI DatePicker

我的网址如下:“localhost:3000 / users_supported?selected_date = 2012-10-31”

到目前为止我做得很好:)我在控制器中的查询看起来像这样:

@support_histories = current_agent.support_histories.where(:created_at => Date.parse(params[:selected_date]))

如何仅从'datetime'db列

中按'日期'正确提取记录

我尝试在Rails控制台中执行此操作,但没有运气:

sh = SupportHistory.where(:created_at => DateTime.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => Date.parse('2012-10-31'))
sh = SupportHistory.where(:created_at => DateTime.strptime('2012-10-31', '%Y-%m-%d'))

我有记录,如果我喜欢下面提到的,但这对我没用,因为我试图通过'日期'而不是'日期时间'找到记录

sh = SupportHistory.where(:created_at => '2012-10-31 19:49:57')

3 个答案:

答案 0 :(得分:23)

selected_date = Date.parse(params[:selected_date])
# This will look for records on the given date between 00:00:00 and 23:59:59
sh = SupportHistory.where(
       :created_at => selected_date.beginning_of_day..selected_date.end_of_day)

时区可能是您需要关注的问题,但如果所有时间都在同一时区,这应该有效。

答案 1 :(得分:0)

我通过在下面的模型中创建方法解决了这个问题, 比如,我的模型是ticket.rb

 def created_date
   self.created_at.to_date
 end

然后我这样查询,

 selected_date = Date.parse(params[:date])

 Ticket.all.map{|t| t if t.created_date == selected_date}.compact

这为我提供了与用户所选日期相匹配的准确结果。

答案 2 :(得分:0)

我有时使用的一个简单解决方案是将日期(时间)字段作为文本转换为数据库,而不是将字符串解析为应用程序端的日期。对于您的情况:

where('CAST(created_at AS text) LIKE ?', params[:selected_date])

可能不是数据库中最有效的,但在应用程序端节省了大量的皮塔饼。