2017-03-16 104 views
-2

我正在爲酒店預訂系統製作網站。我需要關於查詢的幫助,我正在通過後期搜索,但我沒有找到解決方案,將爲我工作。 在我的數據庫我有表預訂,與登記入住和退房日期,需要檢查時,用戶輸入登記入住和退房指定的房間查詢。這裏是我的查詢:查詢酒店預訂系統php

SELECT * FROM booking WHERE room='$room' and ((checkin>='$cIN' and checkout<='$cOUT')or(checkin<='$cIN' and checkout>='$cOUT'))

「$ CIN」和「$ COUT」從用戶在檢查輸入,並檢查了。 我的查詢在某些情況下工作,可以說例如房間預訂時間爲15/03/2017至20/03/2017,當新用戶輸入13/03/2017至17/03/2017時,則查詢不返回任何結果,並且用戶可以預訂同一個房間。因此,在這種情況下,我們在同一時間間隔內的一個房間中有2個用戶。我需要限制這種保留。提前致謝。

+1

你正在檢查一個週期是否完全蓋過其他反之亦然 - 但當然你也需要考慮到用戶輸入的日期只有一個落入已經預訂的時間段的情況。如果您在確定正確的邏輯時遇到問題,那麼我建議您在一張紙上塗寫可能的案例 - 這應該有助於弄清楚。 – CBroe

+0

如果在同一天不能有兩次預訂(第一位客人已預訂到今天,所以下一位客人只能從明天開始預訂),那麼您只需檢查開始日期或結束日期是否落入現有時間段(包括第一天/最後一天的平等) – CBroe

+0

謝謝你的回答,我想我找到了解決方案,你的評論幫助我:) – marjov

回答

0

要找到重疊部分,我們需要在現有結帳之前搜索請求籤入的項目,並且請求的結帳在現有簽入之後進行。

-- Return existing bookings that overlap the requested date range 
SELECT * 
FROM booking 
WHERE room = '$room' 
and checkin <= '$cOUT' and checkout >= '$cIN' 

比你想象:)

注意,該查詢將不會允許新的預訂在那之前的預訂簽出同一時間籤簡單。如果您簽入/出字段做沒有店面的時間,那麼你就需要改變這個邏輯用<,>而不是< =,> =