Как проверить, что даты начала и окончания не мешают другим датам начала и окончания - PullRequest
0 голосов
/ 04 мая 2018

Хочу создать функцию бронирования номеров в отеле - одно бронирование на один номер.

Один из параметров IN в моей функции reservation - это starting_date и ending date, чтобы знать, когда клиент захочет забронировать номер. Также таблица reservations содержит много дат beginning и ending - потому что на номер можно сделать много бронирований.

Как проверить, можно ли обрабатывать, чтобы даты в запросе бронирования и уже зарезервированные даты не мешали?

Мой код сейчас:

CREATE OR REPLACE FUNCTION reservation (
    starting_date   IN DATE,
    ending_date     IN DATE,
    room_capacity   IN NUMBER,
    room_category   IN VARCHAR2
) RETURN NUMBER 
--returns room_id or 0 if is no room 
 IS

    v_room_id   NUMBER;
    CURSOR c1 IS 
    SELECT r.room_id
    FROM  rooms r
        JOIN reservations res ON r.room_id = res.room_id
        JOIN room_category rc ON rc.category_id = r.room_category
    WHERE
        r.capacity = room_capacity
        AND rc.name = room_category 
        --to do--
        ;

BEGIN

v_room_id:=0;
--todo--
return v_room_id;    
END;

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Использовать следующую логику: данное назначение не мешает референтному, если оно начинается после него или заканчивается до него.

Инвертируйте это с помощью NOT, и вы получите пересечения:

reservations res
....
NOT(starting_date> res.end_date OR ending_date< res.start_date)

После применения конверсии, как указано выше в Kaushik Nayak, вы получите

reservations res
....
NOT(starting_date> res.end_date) AND NOT(ending_date< res.start_date)

И, наконец, избавление от NOT с обратным сравнением

reservations res
....
starting_date<= res.end_date AND ending_date>= res.start_date
0 голосов
/ 05 мая 2018

Вы можете попробовать что-то вроде этого, чтобы получить непересекающиеся даты. Используйте скобки осторожно.

reservations res
..
..
AND
   NOT (   starting_date BETWEEN res.start_date AND res.end_date 
        OR ending_date   BETWEEN res.start_date AND res.end_date 
   OR 
   (
      starting_date    < res.start_date 
      AND res.end_date < ending_date 
   )
);

Я не уверен, что вы могли бы упростить это и сделать его чище. Но, попробуйте, если хотите. Используйте их в качестве руководства.

not-(A and B) = (not-A) or  (not-B)
not-(A or B ) = (not-A) and (not-B)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...