2015-12-04 60 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材料