简体   繁体   English

日期+ 7个工作日

[英]date + 7 working days

I need to write a function that will give me a new due date for an invoice. 我需要编写一个函数,该函数将为我提供发票的新到期日。 This needs to be 12 working days after the current due date Say the current due date is 01.Oct.2014. 这需要在当前到期日之后的12个工作日内说当前到期日是2014年10月1日。 If I look at my calendar manually, I can see that the new date would be 17.Oct.2014 (need to exclude weekends). 如果我手动查看日历,可以看到新日期为2014年10月17日(需要排除周末)。

However, I also have a table with Bank Holidays. 但是,我也有一张“银行假期”表。 This would have to be taken into consideration. 这必须予以考虑。 So if I would have a Bank Holiday on 04.Oct.2014, the new due date should be 18.Oct.2014. 因此,如果我要在2014年10月4日放个银行假期,则新的截止日期应该是2014年10月18日。

EDIT: My table with Bank Holidays would look something like this: 编辑:我的银行假期表看起来像这样:

Year: Date: Description 年:日期:说明

2014 04.Oct.2014 Bank Holiday 1 2014 2014年10月4日银行假期1

Any help with this would be deeply appreciated, I'm stuck at this for almost a day now. 对此的任何帮助将不胜感激,我已经坚持了将近一天。

Thanks a lot in advance. 非常感谢。

Kind regards 亲切的问候

Gerben

Something like this should work: 这样的事情应该起作用:

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;

I ended up doing things slightly different. 我做的事情略有不同。 I have a table with all my bank holiday. 我所有的银行假期都有一张桌子。 I created a second table as a kind of calendar. 我创建了第二张表作为日历。 In here, I loaded all dates in a year. 在这里,我加载了一年中的所有日期。 I then flag it as weekend or bank holiday (2 separate columns). 然后,将其标记为周末或银行假期(2个单独的列)。

I take my original due date, and add the 12 days. 我将原定的截止日期加上12天。 I then have a start and end date (v_due_date_old and v_due_date_new) 然后,我有一个开始和结束日期(v_due_date_old和v_due_date_new)

After that, I count how many days there are in my 'calendar' table, where either my flag for weekend or bank holiday is set to Yes. 之后,我计算“日历”表中有多少天,其中我周末或银行假期的标志设置为“是”。 If v_due_date_new is on a Saturday, I add another day to my count. 如果v_due_date_new是星期六,那么我还要增加一天的时间。

I then add the new count to v_due_date_new. 然后,我将新计数添加到v_due_date_new。

As a last step, I check what day v_due_date_new is. 最后一步,我检查v_due_date_new是星期几。 If it is Saturday or Sunday, I add another 2 days 如果是星期六或星期日,我还要再加上2天

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM