日期范围包含无限间隔

时间:2014-05-14 07:25:35

标签: sql oracle algorithm plsql oracle11g

我在Oracle中有一个函数,用于检查第一个日期是否包含第二个日期。它没有问题,因为如果[a, b] [x, y]包含x => a and y <= b and x <= y。适用于定义的start/end date 1start/end date 2。但现在我想修改它。如果任何给定的&#39;开始&#39;日期为NULL,应将其视为+-infinite

这是一个代码:

  FUNCTION CONTAINS(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 (/* milions of conditions here */) THEN
         lv_RESULT := 'Y';
       END IF;

       RETURN lv_RESULT;
  END CONTAINS;

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

SELECT MY_PACKAGE_SQL.CONTAINS(
       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

中的:)类似

1 个答案:

答案 0 :(得分:1)

如果只有的日期不能,你可以这样说:

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

有空值时,你可以声明,比如说

  -Infinity == 1 Jan 1
  +Infinity == 31 Dec 3999 

借助CoalesceNvl功能,您可以实施

  IF (coalesce(p_END_DATE_1, TO_DATE('31.12.3999', 'dd.mm.yyyy')) >=
      coalesce(p_END_DATE_2, TO_DATE('31.12.3999', 'dd.mm.yyyy')) AND
      coalesce(p_START_DATE_1, TO_DATE('1.1.1', 'dd.mm.yyyy')) <= 
      coalesce(p_START_DATE_2, TO_DATE('1.1.1', 'dd.mm.yyyy'))) THEN 
    lv_RESULT := 'Y';
  END IF;