【问题标题】:Select available rooms选择可用房间
【发布时间】:2013-01-29 01:35:52
【问题描述】:

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

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

但是什么都没有出现。

有什么建议吗?

【问题讨论】:

    标签: c# asp.net sql


    【解决方案1】:

    使用 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) 产生了空房间和空档时间。

    【讨论】:

    • 我刚刚注意到,如果在特定日期为房间 1 预订了 9:00 时段,则该时段未显示在结果中,这是正确的。但是,房间 2 也没有显示,尽管该房间在该日期的那个时间还没有被预订。您对出了什么问题有什么建议吗?谢谢
    【解决方案2】:

    您想要每个房间的外部连接,然后过滤没有预订的房间。即使用外连接,其他表为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
    

    【讨论】:

      【解决方案3】:

      由于您需要给定时间段内的可用房间,我认为您应该有 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-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 2019-11-11
        相关资源
        最近更新 更多