PostgreSQL (9.6), я пытаюсь проверить, является ли интервал дат
('2018-11-18 12:00','2018-11-20 12:00')
не перекрывает ни один из следующих интервалов дат в массиве
{('2018-11-21 12:00','2018-11-23 12:00'),('2018-11-19 12:00','2018-11-20 12:00')}
Элементы в массиве составные:
CREATE TYPE reservation AS (
checkIn TIMESTAMP WITHOUT TIME ZONE,
checkOut TIMESTAMP WITHOUT TIME ZONE
)
Вот таблица номеров:
CREATE TABLE rooms (
rId roomId PRIMARY KEY,
hRef hotelId NOT NULL,
rNo roomNo NOT NULL,
rType roomType,
numPeople INTEGER,
rBedOptions roomBed[],
reservations reservation[],
priceNight FLOAT,
FOREIGN KEY (hRef) REFERENCES hotels(hId) ON UPDATE CASCADE ON DELETE SET NULL
)
INSERT INTO rooms VALUES
('R001','H001','101','one-bedroom',1,
ARRAY[row('1 twin')::roomBed],
ARRAY[
row('2018-11-21 12:00','2018-11-23 12:00')::reservation,
row('2018-11-19 12:00','2018-11-20 12:00')::reservation],
450.5);
Обычно я пытаюсь проверить, доступна ли «комната» для выбранного интервала времени, проверяя, не перекрывает ли этот интервал какие-либо существующие интервалы дат бронирования («2018-11-21 12:00», «2018- 11-23 12:00 », (« 2018-11-19 12:00 »,« 2018-11-20 12:00 »). До сих пор я успешно проверял первый элемент массива для каждой строки, написав следующий запрос:
SELECT * FROM rooms R
WHERE R.reservations[1] IS null
OR NOT (('2018-11-18 12:00','2018-11-20 12:00')
OVERLAPS (R.reservations[1].checkIn, R.reservations[1].checkOut))
ORDER BY rid;
Проблема в том, что я не знаю, как проверить все элементы в массиве, если их больше одного. Есть идеи или предложения?