这些是我的表格:
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在这种情况下保留房型?
答案 0 :(得分:0)
您可以从DATE列类型转换为DATETIME列,然后比较一天中的特定时间(即您的特定退房时间,例如上午11点)。
或者,将所有时间转换为UNIX_TIMESTAMP,然后您将完全比简化大于/小于比较,因为它只是一个整数。
答案 1 :(得分:0)
使用MySQL str_to_date
或cast
因为您必须将类型转换为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材料