2016-10-16 4 views
0

SQL上でかなり複雑なものを作成しようとしています。可用性ベースのクエリのSQL連続オカレンス

レンタカーを持つデータベースのお得な情報、およびビットのようスノーフレークpattersあるもののメインテーブルになります。私の目標は

1与えられたことができますクエリを作成することです

id | rent_start | rent_duration | rent_end  | customerID | carId 
    ----------------------------------------------------------------------------------- 
    203 | 2016-10-03 |  5  | 2016-11-07 | 16545 | 4543 
    125 | 2016-10-20 |  9  | 2016-10-28 | 54452 | 5465 
    405 | 2016-11-01 |  2  | 2016-01-02 | 43565 | 346 

)A 2016-10-03から2016-11-03まで 2)日数:たとえば、1

は、実際に少なくとも10の間利用可能な車を検索することを可能にします。CONSECUTIVE 10月10日から11日の間の日数th。 これらの車のIDのリストは十分です...私はちょうどそのようなクエリを設定する方法を本当に知りません。

助けがあれば:私は別のテーブルにすべての車のIDのリストを持っています。

いずれにしても、ありがとう!

答えて

0

この目的のために、レンタルではなく空き状況を処理するほうがはるかに簡単だと思います。

ので:次に

select r.car_id, r.rent_end as avail_start, 
     (select min(r2.rent_start 
     from rentals r2 
     where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
     ) as avail_end 
from rentals r; 

、クエリのために、あなたは少なくとも10日間必要です。

select r.* 
from (select r.car_id, r.rent_end as avail_start, 
      (select min(r2.rent_start 
       from rentals r2 
       where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
      ) as avail_end 
     from rentals r 
    ) r 
where datediff(avail_end, avail_start) >= $days; 

そして最後に、あなたが指定した日付の間になるように、その期間のために必要があります:あなたは、その目的のために having句または副問合せを使用することができます

select r.* 
from (select r.car_id, r.rent_end as avail_start, 
      (select min(r2.rent_start 
       from rentals r2 
       where r2.car_id = r.car_id and r2.rent_start > r.rent_start 
      ) as avail_end 
     from rentals r 
    ) r 
where datediff(avail_end, avail_start) >= $days and 
     ((avail_end > $end and avail_start < $start) or 
     (avail_start <= $start and avail_end >= $start + interval 10 day) or 
     (avail_start > $start and avail_start + interval 10 day <= $end) 
    ); 

どこ自由これは、様々な条件を扱います期間は範囲全体をカバーし、範囲内で開始/終了します。

このロジックにはオフ・バイ・ワン・エラーはありません(返される同じ日付の車が利用可能です)。これにより、問題を解決するための堅実なアプローチが得られるはずです。

ところで、借りたことのない車も含めるべきです。しかし、それはあなたが質問で説明するテーブルでは不可能です。

+0

非常にうまくいきます。あなたが言及した問題(予約なしの部屋)は実際には1つです。 – DeadEnd

+0

もう1つは、最初のレンタル期間の終了日として最初の利用可能日をカウントすることです。それは、車が一度だけ賃貸された場合、または借りたことがある前日に一度だけ予約された場合、利用できないとみなされることを意味します。 – DeadEnd