[英]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.