这些是我的表:
Room
(房间ID、房间名称、房间类型ID、房间状态)
RoomType
(房间类型Id、房间类型名称、房间TypeDesc、房间类型价格)
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";
它运行得很好。但当我的预订房间表已经有客人a为a房间类型做的入住日期(2015年11月1日)和退房日期(2015月11日)的记录时,问题就来了。
当客人B在入住日期为(2015年2月11日)而退房日期为(2014年3月11日。但它应该是可用的,因为客人A已经在2/11退房了。那么在这种情况下,有没有办法让用户B预订房型?
您可以将类型DATE列转换为DATETIME列,然后比较一天中的特定时间(即您的特定退房时间,如上午11点)。
或者,将所有时间转换为UNIX_TIMESTAMP,然后您将获得更简单的大于/小于比较,因为它只是一个整数。
使用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)
避免使用BETWEEN,因为它包含两个日期-请参阅参考资料