搜索房间可用性

时间:2015-12-04 13:28:17

标签: mysql sql database

这些是我的表格:

Room(roomId,roomName,roomTypeId,roomStatus)

RoomType(roomTypeId,roomTypeName,roomTypeDesc,roomTypePrice)

ReservationRoom(reservationId,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表已经有一个checkindate(2015年1月11日)和签出日期(2/11/2015)由guest A为roomtypeA创建的记录时出现了问题。

当客人B在入住日期搜索房间时(2015年11月2日)并且退房日期是(2015年3月11日)。仍然会显示房型A不可用。但它应该是可用的,因为客人A已经在2月11日结账。那么有没有办法让用户B在这种情况下保留房型?

3 个答案:

答案 0 :(得分:0)

您可以从DATE列类型转换为DATETIME列,然后比较一天中的特定时间(即您的特定退房时间,例如上午11点)。

或者,将所有时间转换为UNIX_TIMESTAMP,然后您将完全比简化大于/小于比较,因为它只是一个整数。

答案 1 :(得分: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) 

答案 2 :(得分:0)

避免使用BETWEEN,因为它包含两个日期 - 请参阅reference材料