按最近的日期选择

问题描述 投票:1回答:2

我对此查询存在性能问题:

@event = Event.find_by_sql("
    SELECT * FROM `IdeProNew_development`.`events`
    WHERE device_id = #{session[:selected_cam_id]}
    AND data_type = 'image'
    AND created_at BETWEEN CONVERT('#{params[:selected_date].to_time.beginning_of_day}', DATETIME)
    AND CONVERT('#{params[:selected_date].to_time.end_of_day}', DATETIME)
    ORDER BY abs(CONVERT('#{params[:selected_date]}', DATETIME)- created_at) LIMIT 1
").first

我使用它来通过“selected_date”选择最近的事件......它没关系,但它非常慢,因为扫描所有表(它非常大)并按所选日期和记录创建日期之间的差异排序。

我试着像这样使用DATEDIFF:

@event = Event.find_by_sql("
    SELECT * FROM `IdeProNew_development`.`events`
    WHERE device_id = #{session[:selected_cam_id]}
    AND data_type = 'image' AND created_at
    BETWEEN CONVERT('#{params[:selected_date].to_time.beginning_of_day}', DATETIME)
    AND CONVERT('#{params[:selected_date].to_time.end_of_day}', DATETIME)
    ORDER BY abs(DATEDIFF(CONVERT('#{params[:selected_date]}', DATETIME), created_at)) LIMIT 1
").first`

但它不能很好地工作(有时会给我一个错误的结果)而且它也很慢。

我的错在哪里?我可以使用某种类型的索引来快速进行此查询吗?

ruby-on-rails date select datediff
2个回答
1
投票

为什么不使用活动记录来执行此操作而不是SQL查询?像这样的东西:

`@event = Event.where(:device_id => session[:selected_cam_id]).
               where(:data_type => 'image').
               where("created_at >= ? AND created_at <= ?",    
                                 params[:selected_date].to_time.beginning_of_day, 
                                 params[:selected_date].to_time.end_of_day).
               order("created_at DESC").first`

我认为它更有效率。


1
投票

你也可以试试这个

     @event = Event.where(:device_id => session[:selected_cam_id])
     .where(:data_type => 'image').to_a
     .select{|i| i.created_at.to_time >= params[:selected_date].to_time.beginning_of_day 
&& i.created_at.to_time <= params[:selected_date].to_time.end_of_day}
.sort{ |x,y| y.created_at  <=> x.created_at}.first
© www.soinside.com 2019 - 2024. All rights reserved.