2016-10-16 50 views
0

我有點卡住試圖創建一個非常複雜的SQL,更具體的MySQL。SQL連續發生的基於可用性的查詢

汽車租賃,以及什麼是雪花patters主表的數據庫的交易看起來有點像:

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 

我的目標是創建一個允許給予

1查詢)一例如:從2016-10-03到2016-11-03 2)多少天,例如:10

允許我檢索實際可用的汽車至少10個連續10月10日至11日之間的天數日。 這些汽車的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天。您可以使用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; 

最後,你需要爲這一時期的日期內被指定:

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

工程超級好,是的你提到的問題(沒有預訂的房間)實際上是一個。 – DeadEnd

+0

另一個是它將第一個可用日期作爲第一次租賃的結束時間。這意味着如果一輛汽車只租了一次,或者預訂只在以前的任何日期被認爲不可用時才被租用。 – DeadEnd