选择可用房间
本文关键字:房间 选择 | 更新日期: 2023-09-27 17:58:53
我正在创建一个房间预订系统。
我需要创建一个SQL查询,这样一旦用户选择了日期,就会显示在特定日期特定时间可用的房间列表。但我只储存已预订的房间。
目前包括在其中的3个表是Tbl_Room
、Tbl_Booking
和Tbl_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