选择可用的房间

时间:2013-02-13 13:29:53

标签: c# asp.net sql

我正在创建一个房间预订系统。

我需要创建一个SQL查询,以便在用户选择日期后,会显示特定时间内特定日期可用的房间列表。但我只存储预订的房间。

目前包含的3个表格为Tbl_RoomTbl_BookingTbl_TimeSlot

Tbl_Room存储所有不同的房间。

Tbl_Booking存储预订日期,RoomID,TimeslotID,BookingName

Tbl_TimeSlot包含StartTime和EndTime

因此,我希望显示所选时间和所选时间可用的每个时间段。 我试过的SQL查询是:

SELECT
    Tbl_TimeSlot.TimeslotID_PK, 
    Tbl_TimeSlot.StartTime, 
    Tbl_TimeSlot.EndTime,
    Tbl_Booking.RoomID_FK, 
    Tbl_Booking.BookingName, 
    Tbl_Booking.BookingDate,  
    Tbl_Room.RoomName         
FROM
    Tbl_Room RIGHT 
    OUTER JOIN
        Tbl_Booking ON Tbl_Room.RoomID_PK = Tbl_Booking.RoomID_FK 
    RIGHT OUTER JOIN
        Tbl_TimeSlot ON Tbl_Booking.TimeSlotID_FK = Tbl_TimeSlot.TimeslotID_PK
WHERE (Tbl_Booking.BookingDate <> @BookingDate)
    AND (Tbl_Booking.RoomID_FK <> @RoomID)

但没有出现。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

由于您需要特定时段的可用房间,我认为您应该有2个输入参数:@FromBookingDate@ToBookingDate

然后,您可以在数据库中查询该期间占用的房间。

获得占用房间列表后,您只需假设其他房间可用。

获取被占用房间的示例:

select b.RoomId from Tbl_Booking b
inner join Tbl_TimeSlot s on b.RoomId = s.RoomId
where s.StartTime <= @ToBookingDate and s.EndTime > @FromBookingDate

获取可用房间:

select * from Tbl_Room where id not in ( ...<occupied rooms>... )

答案 1 :(得分:0)

您想要每个房间的外部连接,然后过滤没有预订的房间。也就是说,使用外连接,其他表为NULL的记录。

SELECT ...
FROM Tbl_Room
  LEFT OUTER JOIN Tbl_Booking ON Tbl_Room.RoomID_PK = Tbl_Booking.RoomID_FK 
WHERE Tbl_Booking.BookingDate = @BookingDate
  AND Tbl_Booking.RoomID_FK IS NULL

答案 2 :(得分:0)

使用CROSS JOIN(生产:房间x时间段为1天)将Tbl_Room与Tbl_TimeSlot相乘,然后使用已预订@BookingDate的房间x时间段减去,如下所示:

 SELECT Tbl_Room.RoomName, Tbl_TimeSlot.StartTime
 FROM Tbl_TimeSlot CROSS JOIN Tbl_Room
 EXCEPT
 (SELECT Tbl_Room.RoomName, Tbl_TimeSlot.StartTime
  FROM Tbl_TimeSlot CROSS JOIN Tbl_Room 
    FULL OUTER JOIN Tbl_Booking 
        ON Tbl_TimeSlot.TimeslotID_PK = Tbl_Booking.TimeSlotID_FK
 WHERE (Tbl_Booking.BookingDate = @BookingDate))

该查询产生了空房间&amp;给定日期的空槽时间(@BookingDate)。