我正在创建一个房间预订系统。
我需要创建一个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)
但没有出现。
有什么建议吗?
答案 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)。