我在Oracle
中有一个函数可以检查两个日期是否相互重叠。它没有问题,因为如果[a, b]
[x, y]
与b > x and a < y
重叠。适用于定义的start/end date 1
和start/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_1
为NULL
。在这种情况下代码:
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
:)
类似
答案 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