我在Oracle
中有一个函数,用于检查第一个日期是否包含第二个日期。它没有问题,因为如果[a, b]
[x, y]
包含x => a and y <= b and x <= y
。适用于定义的start/end date 1
和start/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_1
为NULL
。在这种情况下代码:
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
:)
类似
答案 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
借助Coalesce
或Nvl
功能,您可以实施
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;