我想创建预订酒店房间的功能 - 一个房间预订。
我的函数reservation
中的一个IN参数是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;
答案 0 :(得分:1)
你可以尝试这样的东西来获得不重叠的日期。仔细使用括号。
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)
答案 1 :(得分:1)
使用下一个逻辑:如果约会在他之后开始或在他之前结束,则给定约会不会干涉指示对象。
使用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