日期+7个工作日

时间:2014-09-18 11:01:28

标签: oracle function date

我需要写一个函数,它会给我一张发票的新截止日期。这需要在当前截止日期之后的12个工作日内完成 说当前截止日期是01.Oct.2014。如果我手动查看我的日历,我可以看到新的日期是17.Oct.2014(需要排除周末)。

但是,我还有银行假期的表格。必须考虑到这一点。因此,如果我在04.Oct.2014有一个银行假日,新的截止日期应该是18Oct.2014。

编辑:银行假期的表格看起来像这样:

年份:日期:说明

2014 04.Oct.2014 Bank Holiday 1

对此的任何帮助都将深表感谢,我现在已经坚持了近一天。

提前多多感谢。

亲切的问候

2 个答案:

答案 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天