- tsrange('2025-09-26 12:10', '2025-09-26 12:40'); -- 結果は「12:00〜12:10」と「12:40〜13:00」に分断される -- 複数の範囲はrange型では扱えずエラーとなる ERROR: result of range difference would not be contiguous ◼ Range型ではひとつの連続した範囲しか扱えないのでエラーになる -- 例: 「12:00〜13:00」から「12:10〜12:40」を引く
CREATE VIEW reservation_availabilities AS WITH -- 1) 予約できない期間をUNIONでひとつの表にまとめる reservation_unavailabilities AS ( -- 既存の予約 SELECT room_id, period FROM reservations UNION ALL -- ルームのメンテナンス SELECT room_id, period FROM room_reservation_unavailabilities UNION ALL -- 店舗の休業 SELECT r.id AS room_id, sr.period FROM studio_reservation_unavailabilities sr JOIN rooms r ON r.studio_id = sr.studio_id ), -- 2) range_aggで予約不可を「多重範囲(multirange)」に集約 multi_reservation_unavailabilities AS ( SELECT room_id, range_agg(period) AS multi_period FROM reservation_unavailabilities GROUP BY room_id ), -- 3) 1週間の範囲 - 予約不可範囲 = 予約可能範囲 reservation_availabilities AS ( SELECT room_id, tsmultirange( tsrange(current_date, current_date + interval '7 days’) ) - multi_period AS multi_period FROM multi_reservation_availabilities ) -- 4) multirange を unnest で展開して、個々の空き期間(tsrange)にする SELECT room_id, unnest(multi_period) AS period FROM reservation_availabilities;