0

特定の日付範囲に重複するすべてのリストを検索しようとしていますが、期待どおりに機能していません。ID、start_date、end_date、listing_id を持つ「UnavailableDate」モデルがあります。私がこれまでに持っているものは次のとおりです。

   @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 の配列が得られるようにします。これをメインの Thinking Sphinx クエリの :without 句で使用できます (検索日の 50% 以上で利用できないすべてのリスティングを削除するため)。それを行うにはかなり非効率的な方法のように思えますが、それが私の唯一の選択肢だと思います

アドバイスをよろしくお願いします!

4

1 に答える 1

0

2 つの日付範囲が重複しているかどうかのロジックは単純で、範囲 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 に答える