先訂清楚要判斷甚麼,再準備資料
只有一個預約也可能超出容量,查時段衝突未必找得到。把每筆已確認人數與該房上限比較。這是單一預約的檢查,與同時使用房間的人數不同;不能把全日不同時段的人數合計後稱為超額。
以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。
| 編號 | 房間編號 | 預約人數 | 狀態代碼 |
|---|---|---|---|
| B1 | R1 | 5 | confirmed |
| B2 | R1 | 4 | confirmed |
| B3 | R1 | 2 | confirmed |
| B4 | R2 | 5 | confirmed |
| B5 | R2 | 1 | cancelled |
CREATE TABLE rooms(id TEXT PRIMARY KEY, capacity INTEGER);
CREATE TABLE bookings(id TEXT PRIMARY KEY, room_id TEXT, starts_at TEXT, ends_at TEXT, seats INTEGER, status TEXT);
CREATE TABLE waitlist(id TEXT PRIMARY KEY, booking_id TEXT, requested_seats INTEGER, joined_at TEXT);
INSERT INTO rooms VALUES ('R1',8),('R2',4);
INSERT INTO bookings VALUES ('B1','R1','2026-10-10 09:00','2026-10-10 10:00',5,'confirmed'),('B2','R1','2026-10-10 09:30','2026-10-10 10:30',4,'confirmed'),('B3','R1','2026-10-10 10:30','2026-10-10 11:30',2,'confirmed'),('B4','R2','2026-10-10 12:00','2026-10-10 13:00',5,'confirmed'),('B5','R2','2026-10-10 12:00','2026-10-10 13:00',1,'cancelled');
INSERT INTO waitlist VALUES ('W1','B3',7,'2026-10-08 09:00'),('W2','B3',2,'2026-10-08 10:00'),('W3','B3',1,'2026-10-08 11:00');執行查詢,核對實際結果
SELECT b.id,b.room_id,b.seats,r.capacity,b.seats-r.capacity AS excess_seats
FROM bookings b JOIN rooms r ON r.id=b.room_id
WHERE b.status='confirmed' AND b.seats>r.capacity ORDER BY b.id;| 編號 | 房間編號 | 預約人數 | 房間上限 | 超額人數 |
|---|---|---|---|---|
| B4 | R2 | 5 | 4 | 1 |
B4 在 R2 預約 5 人,但房間上限只有 4 人,多了 1 人。B1 和 B2 單獨看都未超過 R1 容量,卻有時段衝突,須用另一項檢查處理。先確認實際人數及合適房間,再改預約。
按資料範圍使用結果
容量是本例的系統設定,不代表法定場地上限。接不到房間的紀錄需另外查核,內連接不會列出。若多人可共用一節,須另計該時段的總人數。
本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。