日期范围与无限间隔重叠

时间:2014-05-13 12:44:43

标签: sql oracle algorithm plsql

我在Oracle中有一个函数可以检查两个日期是否相互重叠。它没有问题,因为如果[a, b] [x, y]b > x and a < y重叠。适用于定义的start/end date 1start/end date 2。但现在我想修改它。如果任何给定日期为NULL,则应将其视为+-infinite

这是一个代码:

  FUNCTION OVERLAP(p_START_DATE_1 DATE, p_END_DATE_1 DATE,
   p_START_DATE_2 DATE, p_END_DATE_2 DATE) RETURN VARCHAR2 AS

   lv_RESULT VARCHAR2(1);
  BEGIN 
       lv_RESULT := 'N';      

       IF (p_START_DATE_1 <= p_END_DATE_2 AND p_END_DATE_1 >= p_START_DATE_2) THEN
         lv_RESULT := 'Y';
       END IF;

       RETURN lv_RESULT;
  END OVERLAP;

例如:假设p_START_DATE_1NULL。在这种情况下代码:

SELECT MY_PACKAGE_SQL.OVERLAP(
       NULL,
       TO_DATE('01/12/2014', 'DD/MM/YYYY'),
       TO_DATE('01/02/2012', 'DD/MM/YYYY'),
       TO_DATE('01/05/2012', 'DD/MM/YYYY'))
FROM DUAL;

...应该返回Y,因为第一个日期范围是(-infinite, 01/12/2014],并且它与[01/02/2012, 01/05/2012]重叠。

现在我的问题......我知道我可以使用额外的"IFs"来检查NULLs。但我想知道是否有任何其他解决方案可以使Oracle's PL\SQL语言更快?它与我的团队do it in smarter way challenge

中的:)类似

2 个答案:

答案 0 :(得分:2)

以下是实现此目的的一种方法:

   IF (coalesce(p_START_DATE_1, p_end_date_2, sysdate) <= coalesce(p_END_DATE_2, p_START_DATE_1, sysdate) AND
       coalesce(p_END_DATE_1, p_START_DATE_2, sysdate) >= coalesce(p_START_DATE_2, p_END_DATE_1, sysdate) THEN

我们的想法是将NULL值替换为满足每个条件的值。如果两者都是NULL,则使用sysdate

答案 1 :(得分:2)

if nvl(p_START_DATE_1<=p_END_DATE_2 and p_START_DATE_2<=p_END_DATE_1, true) then

编辑:
检查[start1,end1]是否包含[start2,end2]:

if nvl(start1 <= nvl(start2,start1 - 1) and end1 >= nvl(end2,end1 + 1),true) then