2013-11-24 129 views
0

基本上我做我的計算級別的課程基本的酒店預訂系統,並紛紛創出絆腳石(或者有偏頭痛也無濟於事!)酒店客房預訂聲明

我在檢查用戶是否可以預訂房間的過程(該應用程序全部由用戶運行並由其使用),但是試圖讓我的腦袋知道如何去做。

目前我想我可以在當前的預訂數據庫中搜索我想要預訂的房間號和日期,如果比賽回來,那意味着某個房間被預訂了。這一切都很好,但如何告訴它日期的範圍? (對不起,壞的問題)我就行思的sql語句的僞代碼版本:

如果「您在預訂的日期已經在數據庫」 前「檢查日期的新預訂''退房日期已經預訂 對數據庫'是在'檢查日期的新預訂'然後房間是 已經預訂。

基本上,如果它返回一個記錄,那麼我知道房間已預訂。但我只需要弄清楚如何使用SQL根據我的入住/退房日期來搜索記錄。

但是,這將允許雙重預訂,唉它讓我發瘋:/任何想法?

回答

3

它看起來可能不是第一次完全顯而易見的,但你其實可以簡化充分的測試或部分日期重疊只有兩個條件

假設您已有BOOKING表格,包含現有預訂和新入住日期的登記入住日期@NEW_CHECK_IN和結帳日期@NEW_CHECK_OUT。要尋找重疊的這些日期(假設端點包括在內)的所有預訂,你只需要這樣的where子句:

--Select overlapping bookings 
-- ... 
WHERE BOOKING.CHECK_IN <= @NEW_CHECK_OUT 
    AND BOOKING.CHECK_OUT >= @NEW_CHECK_IN 
-- ... 

我知道這看起來太簡單,但嘗試一下與DRF所示的場景( (1)新預訂在現有預訂之後,(2)新預訂嚴格在現有預訂之內,以及(3)新預訂等於現有預訂)。你會看到這一套簡單的條件涵蓋了所有這些情況。

2

建議的僞代碼僅考慮現有預訂和新預訂之間存在衝突的一種可能性。爲了說明,考慮一個房間有一個預訂。

  |======================| 
     Check-in date  Check out date 

假設我們要創建一個新的預訂,並有4個潛在的新預訂。

  |======================|  Existing booking 

     |-----------------------------| New booking (Scenario 1) 
    |----------|       New booking (Scenario 2) 
         |-------------| New booking (Scenario 3) 
|---|         New booking (Scenario 4) 

其中,只有方案4不重疊的現有預訂;其他人與現有預訂相沖突。儘管您的僞代碼解決方案1,但它不檢測方案2或3,因此可以進行雙重預訂。

實際上,您的僞代碼可能看起來像這樣。

Let E = booking already on the database 
    N = new booking, 
    CID = check-in date, 
    COD = check-out date 

For a new booking N, N conflicts with an existing booking iff there exists a record E where: 
    (CID of E is between CID of N and COD of N), or 
    (COD of E is between CID of N and COD of N), or 
    (CID of N < CID of E and COD of N > COD of E) 

在SQL中,根據您的架構,查詢可能類似於這樣的事情:

-- assume @new_cid is the new checkin date and @new_cod is the new checkout date 
select count(*) from bookings 
where 
@new_cid between bookings.checkindate and bookings.checkoutdate or 
@new_cod between bookings.checkindate and bookings.checkoutdate or 
(@new_cid <= bookings.checkindate AND @new_cod > bookings.checkoutdate) 
+0

我會試一試,但你已經完全解釋了我正在嘗試的內容!對不起,我的嘗試很痛苦,所以謝謝你的理解。再次感謝你! – ConnorL