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

Rails Query Filtering by Comparing if Two Date Ranges Overlap

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

如何编写 Model.where()(或适当的活动记录查询语法),以便如果 event_startevent_end 之间的任何日期与任何日期相同view_startview_end 之间的日期那么该记录是否包含在内?

event_startevent_end 是我的 table(模型属性)中的列。

view_startview_end 在参数散列中可用。

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

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

试试这个:

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

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