选择可用房间

本文关键字:房间 选择 | 更新日期: 2023-09-27 17:58:53

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

我需要创建一个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)

但什么都没有出现。

有什么建议吗?

选择可用房间

使用CROSS JOIN将Tbl_Room与Tbl_TimeSlot相乘(生成:房间x时隙1天),然后减去在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))

那个查询产生了空房间&给定日期(@BookingDate)的空时段时间。

由于您需要一段时间内的可用房间,我认为您应该有两个输入参数:@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>... )

您希望每个房间都有一个外部联接,然后筛选没有预订的房间。也就是说,使用外部联接,记录另一个表为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