2010-11-27 54 views
3

我正在寫一個簡單的汽車租賃(學校任務)預訂程序。我和我的好友正試圖讓這個系統比分配任務更先進一些,但我們遇到了一些問題,我們希望您能幫助我們。檢查重疊的汽車保留

這個想法是,你可以保留一定的汽車類型,當你得到汽車時,它會是這種類型的汽車之一(你不會保留特定的汽車,因爲我們的任務規定,但只有一種類型)。只有一位顧客可以在特定的日期安排車輛。由於我們必須確保保留的預訂,我們不會租用每種類型的汽車,而不是我們所擁有的。預訂基本上存儲有開始日期,結束日期和汽車類型。

如果我們忽略了現在的汽車類型(可以說我們只有一種類型),則保留可以以圖形看起來像這樣:

1/12 2/12 3/12 4/12 5/12 6/12 7/12 
|-------------------| 
        |-----------------| 
           |-----| 
|-------| 
          |-----------| 
|-------------| 

如果租用只有三輛汽車也將有可能租一輛車從3/12到5/12,因爲所有的日子只有2輛車預訂。但我們怎麼知道這一點?我們是否必須檢查每個日期和計數()跨越該日期的預訂數量?

如果有人有什麼保留了上4/12,然後3/12 5/12和汽車仍然只有2所保留,但4/12將有3

是否有可能做用一個查詢如何,還是我們不得不通過程序中的每個日期來檢查保留的數量是否未超過汽車的數量? (這很簡單,只有完整的日期,但考慮可以每小時租用汽車的情況(不僅在每天的這裏),然後它可能是一個通過每個我們如果我們有很多預訂和汽車,時間跨度很長......)

希望你有一些很好的想法,這將幫助我們一起。感謝您抽出寶貴的時間來閱讀問題:)

  • 的Mikkel,丹麥
+1

的可能重複[確定是否兩日期範圍重疊](http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) – 2010-11-27 20:46:09

回答

1

「有沒有可能與查詢做一些怎麼樣,還是我們必須步步在每個日期檢查預訂數量沒有超過車輛數量的程序?(這很容易,只有完整的日期,「

你的問題的性質是違反約束可能出現在任何單獨的日期。因此從邏輯上說,確實需要對新預訂中包含的每個單獨日期進行檢查可能的調整是在「最小間隔」級別進行檢查。要做到這一點,您必須首先計算已經出現在數據庫中的所有時間間隔,以及與新預訂重疊的時間間隔。例如,4/12-6/12的新預訂必須分成4/12-5/12(第二行)和5/12-6/12(第三行)。這些單獨的時間間隔可能會超過一天,您可以在這些時間間隔內進行檢查。 (在這個例子中,它們與單獨的日子相同,但是保留7/12-19/12根本不需要分割。

但是,計算這可能很困難,而且還有另一個警告:您正在尋找多行插入,您還應該拆分要插入的其他行(並且要求您將所有插入的行記錄在臨時表中,否則您將無法訪問它們)。

1

假設,你在現實生活中這樣的預訂情況:

 1/12 2/12 3/12 4/12 5/12 6/12 7/12 
Car1: |-------------------| 
Car2:      |-----------------| 
Car3: |-------|  |-----------|  |-----|        
Car4: |-------------| 

car

| id | type | registration | 
| 1 | 1 | HH1111  | 
| 2 | 1 | HH3333  | 
| 3 | 2 | HH77   | 
| 4 | 3 | DD999  | 

reservation

| car_id | date_from | date_to | 
| 1  | 2013-12-01 | 2013-12-04 | 
| 2  | 2013-12-04 | 2013-12-07 | 
| 3  | 2013-12-01 | 2013-12-02 | 
| 3  | 2013-12-03 | 2013-12-05 | 
| 3  | 2013-12-06 | 2013-12-07 | 
| 4  | 2013-12-01 | 2013-12-03 | 

現在,您必須通過很簡單的邏輯,選擇所有可用的汽車的時間段爲

2013-12-052013-12-06

「全選車,這不具有日期的任何保留,哪些塊它使用」 與BRILLIAN MySQL的選擇:

select * from car where not exists (select * from reservation 
where car.id = reservation.car_id AND 
date_from < '2013-12-06' AND 
date_to > '2013-12-05')