如何检查开始和结束日期是否与其他人的开始和结束日期不一致

时间:2018-05-04 20:28:15

标签: sql oracle plsql

我想创建预订酒店房间的功能 - 一个房间预订。

我的函数reservation中的一个IN参数是starting_dateending date,以了解客户想要预订的时间。 此外,reservations表包含大量beginningending日期 - 因为在房间内可以有很多预订。

如何检查是否可以处理预订请求中的日期并且已保留的日期不会干扰?

我的代码现在:

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 :(得分: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