通过比较两个日期范围重叠来进行Rails查询过滤

时间:2015-01-15 17:45:04

标签: ruby-on-rails ruby date activerecord

我有4个日期参数event_start, event_end, view_start, view_end

如何编写Model.where()(或相应的活动记录查询语法),以便IF event_startevent_end之间的任何日期与中间的任何日期相同view_startview_end然后包含该记录?

event_startevent_end是我的表格中的列(模型上的属性)。

view_startview_end在params哈希中可用。

2 个答案:

答案 0 :(得分:2)

只有两种情况不显示记录:当view_start大于event_endview_end小于event_start时。 (假设查看日期的顺序正确)。因为我们正在寻找对此的否定,使用德摩根定律:

if view_start < view_end
  Model.where('event_start < ? AND event_end > ?', view_end, view_start)
else
  Model.none

答案 1 :(得分:1)

试试这个:

  Model.
    where(Model.arel_table[:event_start].lt(params[:view_end])).
    where(Model.arel_table[:event_end].gt(params[:view_start]))

将找到重叠的范围。根据您的应用程序处理端点的小时数,您可能需要将这些更改为例如gteq