Rails 通过比较两个日期范围是否重叠来进行查询过滤
Rails Query Filtering by Comparing if Two Date Ranges Overlap
我有 4 个日期参数 event_start, event_end, view_start, view_end
如何编写 Model.where()(或适当的活动记录查询语法),以便如果 event_start
和 event_end
之间的任何日期与任何日期相同view_start
和 view_end
之间的日期那么该记录是否包含在内?
event_start
和 event_end
是我的 table(模型属性)中的列。
view_start
和 view_end
在参数散列中可用。
只有两种情况不显示记录:view_start
大于event_end
和view_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
.
我有 4 个日期参数 event_start, event_end, view_start, view_end
如何编写 Model.where()(或适当的活动记录查询语法),以便如果 event_start
和 event_end
之间的任何日期与任何日期相同view_start
和 view_end
之间的日期那么该记录是否包含在内?
event_start
和 event_end
是我的 table(模型属性)中的列。
view_start
和 view_end
在参数散列中可用。
只有两种情况不显示记录:view_start
大于event_end
和view_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
.