1

部屋の予約システムを作成しています。

ユーザーが日付を選択すると、特定の日に特定の時間に利用可能な部屋のリストが表示されるように、SQL クエリを作成する必要があります。ただし、予約された部屋のみを保存します。

現時点でこれに含まれる 3 つのテーブルはTbl_Room、 、Tbl_BookingおよびTbl_TimeSlot

Tbl_Roomすべての異なる部屋を格納します。

Tbl_Booking予約日、RoomID、TimeslotID、BookingName を保存します

Tbl_TimeSlotStartTime と 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 を乗算し (作成: room x 1 日のタイムスロット)、@BookingDate のように予約済みの room 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) に空の部屋と空のスロット時間を生成しました。

于 2013-02-13T17:01:17.780 に答える