我有這些桌子
- 酒店(酒店編號、酒店名稱、城市)
- 房間(房間號、酒店號、型別、價格)
- 預訂(hotelNo、guestNo、dateFrom、dateTo、roomNo)
- 來賓(guestNo,guestName,guestAddress)
如何列出“2022 年 3 月 1 日”未預訂的酒店和客房?
到目前為止我已經嘗試過:
SELECT *
FROM Hotel h, Room r, Booking b
WHERE h.hotelNo = r.hotelNo
AND b.roomNo = r.roomNo
??? AND NOT (b.dateFrom and b.dateTo not contains ‘2022-03-01’) ???
uj5u.com熱心網友回復:
您可以使用'2022-03-01' NOT BETWEEN b.dateFrom and b.dateTo
uj5u.com熱心網友回復:
SELECT * FROM Hotel h,
JOIN Room r ON h.HotelNo=r.HotelNo
JOIN Booking b ON b.roomNo = r.roomNo
WHERE '2022-03-01' NOT BETWEEN b.dateFrom and b.dateTo
uj5u.com熱心網友回復:
范圍型別自 9.2 起可用!https://www.postgresql.org/docs/9.2/rangetypes.html
讓我們根據手冊教程使用范圍進行重構。
CREATE EXTENSION btree_gist;
CREATE TABLE room_booking (
hottelNO,
guestNo,
roomNo text,
during daterange,
EXCLUDE USING gist (roomNo WITH =, during WITH &&)
);
然后
SELECT * FROM Hotel h,
JOIN Room r ON h.HotelNo=r.HotelNo
JOIN room_booking b ON b.roomNo = r.roomNo
WHERE during @> '2022-03-01' is false;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443413.html
標籤:sql PostgreSQL
