我需要写一个函数,它会给我一张发票的新截止日期。这需要在当前截止日期之后的12个工作日内完成 说当前截止日期是01.Oct.2014。如果我手动查看我的日历,我可以看到新的日期是17.Oct.2014(需要排除周末)。
但是,我还有银行假期的表格。必须考虑到这一点。因此,如果我在04.Oct.2014有一个银行假日,新的截止日期应该是18Oct.2014。
编辑:银行假期的表格看起来像这样:年份:日期:说明
2014 04.Oct.2014 Bank Holiday 1
对此的任何帮助都将深表感谢,我现在已经坚持了近一天。
提前多多感谢。
亲切的问候
戈
答案 0 :(得分:2)
这样的事情应该有效:
DECLARE
l_date DATE := SYSDATE;
FUNCTION IS_WEEKEND(P_DATE IN DATE)
RETURN BOOLEAN
IS
l_daynum VARCHAR2(1) := to_char (P_DATE, 'D');
BEGIN
RETURN l_daynum = '6' OR l_daynum = '7';
END;
FUNCTION IS_HOLIDAY(P_DATE IN DATE)
RETURN BOOLEAN
IS
CURSOR c_exists IS
SELECT 1 FROM bank_holidays WHERE date = TRUNC(P_DATE)
;
l_count NUMBER;
BEGIN
OPEN c_exists;
l_count := c_exists%ROWCOUNT;
CLOSE c_exists;
RETURN l_count > 0;
END;
PROCEDURE ADD_WORKING_DAYS(P_DATE IN OUT DATE, P_DAYS IN NUMBER)
IS
l_workdays_added NUMBER := 0;
BEGIN
WHILE TRUE
LOOP
P_DATE := P_DATE + 1;
IF NOT IS_WEEKEND(P_DATE) AND NOT IS_HOLIDAY(P_DATE) THEN
l_workdays_added := l_workdays_added + 1;
END IF;
IF l_workdays_added = P_DAYS THEN
RETURN;
END IF;
END LOOP;
END;
BEGIN
ADD_WORKING_DAYS(l_date, 12);
END;
答案 1 :(得分:0)
我最终做的事情略有不同。我有一张桌子,上面有我的银行假期。我创建了第二个表作为一种日历。在这里,我加载了一年中的所有日期。然后我将其标记为周末或银行假日(2个单独的列)。
我采用原始截止日期,并添加12天。然后我有一个开始和结束日期(v_due_date_old和v_due_date_new)
之后,我会计算我的日历中有多少天?'表,我的周末或银行假日标志设置为是。如果v_due_date_new在星期六,我会再计算一天。
然后我将新计数添加到v_due_date_new。
作为最后一步,我查看v_due_date_new是哪一天。如果是周六或周日,我再添加2天