0

我正在尝试查找与给定日期范围重叠的所有列表,但它并没有按预期工作。我有一个“UnavailableDate”模型,带有 id、start_date、end_date 和 Listing_id。到目前为止,我所拥有的是:

   @unavailable_listings = UnavailableDate.find_by_sql("SELECT listing_id, SUM((LEAST(extract(epoch FROM end_date), #{check_out.to_i}) - GREATEST(extract(epoch FROM start_date), #{check_in.to_i}))/86400) AS overlap FROM unavailable_dates GROUP BY listing_id")

这在一定程度上是有效的,尽管当列表有多个“UnavailableDate”时,SUM 无法正常工作。但是,我真正需要做的是添加一个 WHERE 子句,因此只能找到那些“重叠”大于 X 的列表。解决这个问题的最佳方法是什么?

基本上,我希望这个查询产生一个列表 ID 数组,然后我可以在 :without 子句中的主要 Thinking Sphinx 查询中使用它(以删除超过 50% 的搜索日期不可用的所有列表)。似乎是一种相当低效的方法,但我认为这是我唯一的选择

提前感谢您的任何建议!

4

1 回答 1

0

两个日期范围是否重叠的逻辑很简单,范围 1 的结束日期大于或等于范围 2 的开始日期,范围 1 的开始日期小于或等于范围 2 的结束日期。

where range1.end_date   >= range2.start_date and
      range1.start_date <= range2.end_date

>= 和 <= 最终可能是 > 或 <,具体取决于您对范围边界的定义。

可以通过以下方式计算重叠的大小:

least(range1.end_date, range2.end_date) - greatest(range1.start_date, range2.start_date)

将函数调用调整为您的 RDBMS 用于查找最早和最晚日期的任何内容,并且根据您对开始日期和结束日期的定义,您可能需要将该值调整为常数。

于 2013-09-19T07:13:49.827 回答