2015-12-04 61 views
1

這些都是我的表:搜索房間可用性

Room(roomId,ROOMNAME,roomTypeId,roomStatus)

RoomType(roomTypeId,roomTypeName,roomTypeDesc,roomTypePrice)

ReservationRoom(預留ID,roomId,checkInDate ,checkOutDate,totalStay)

我從用戶那裏收到三個參數(入住日期,退房日期,數量),以搜索可用的房間類型用於網格視圖。

這是我的SQL,顯示可用房間類型的儲備。

SELECT rt.roomTypeName, rt.roomTypePrice, count(*) as quantity 
FROM Room r, 
    RoomType rt 
WHERE roomStatus = 'Online' 
    AND r.roomTypeId = rt.roomTypeId 
    AND NOT EXISTS (SELECT 1 FROM ReservationRoom b 
        WHERE b.roomId = r.roomId 
        AND (@CheckInDate BETWEEN b.checkInDate AND b.checkOutDate 
         OR @CheckOutDate BETWEEN b.checkInDate AND b.checkOutDate 
         OR (@CheckInDate<= b.checkInDate AND @CheckOutDate >= b.checkOutDate))) 
group by rt.roomTypeName, rt.roomTypePrice 
Having COUNT(*) >= @quantity"; 

它工作得很好。但是,當我的ReservationRoom表已經有一個記錄,那就是客人A爲roomtypeA所做的checkindate(1/11/2015)和退房日期(2/11/2015)。

當客人B在入住日期搜索房間是(2015年2月11日)和退房日期是(3/11/2015),它仍然會顯示roomtypeA不可用。但它應該是可用的,因爲客人A已經在2月11日退房。那麼有什麼辦法讓用戶B在這種情況下保留房型?

+0

如果您喜歡,請考慮遵循以下簡單的兩步操作步驟:1.如果您沒有使用阿拉伯膠dy完成後,提供適當的CREATE和INSERT語句(和/或sqlfiddle),以便我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

回答

0

您可以從DATE列類型轉換爲DATETIME列,然後比較特定時間(即您的特定退房時間,例如上午11點)。或者,將所有時間轉換爲UNIX_TIMESTAMP,然後您將會完全比較簡單的大於/小於比較,因爲它只是一個整數。

0

使用MySQL的str_to_datecast,因爲你必須要你的類型轉換爲DATE

cast(str_to_date('1/11/2015','%d/%m/%Y')as date) 

cast(str_to_date(checkindate,'%d/%m/%Y')as date) 
0

避免使用BETWEEN,因爲它是包含兩個日期的 - 看到reference材料