1

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

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

目前包含在其中的 3 个表是Tbl_Room,Tbl_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)

但是什么都没有出现。

有什么建议么?

4

3 回答 3

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>... )
于 2013-02-13T13:41:38.037 回答
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
于 2013-02-13T13:45:19.793 回答
0

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

 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)产生空房间和空槽时间。

于 2013-02-13T17:01:17.780 回答