我需要写一个函数,给我一个新的到期日发票。这需要在当前到期日之后的12个工作日,例如当前的到期日是2014年10月1日。如果我手动查看我的日历,我可以看到新的日期是2014年10月17日(需要排除周末)。
不过,我还有一张带银行假日的桌子。必须考虑到这一点。因此,如果我在2014年10月4日有一个银行假期,新的到期日应该是2014年10月18日。
编辑:我在银行假日的桌子看起来应该是这样的:
年份:日期:说明
2014年10月4日银行假日1
这方面的任何帮助都将是非常感谢的,我已经坚持了将近一天了。
提前谢谢。
亲切的问候
格本
发布于 2014-09-18 16:04:48
最后我做的事情有点不同。我有一张有我所有银行假期的桌子。我创建了第二个表作为一种日历。在这里,我在一年内把所有的日期都装上了。然后,我将其标记为周末或银行假日(两栏)。
我取了我原来的预产期,再加上12天。然后我有一个开始和结束日期(v_due_date_old和v_due_date_new)
在此之后,我数一数我的“日历”表中有多少天,周末或银行假日的国旗设置为“是”。如果v_due_date_new是星期六,我在我的计数中再加上一天。
然后我将新的计数添加到v_due_date_new中。
作为最后一步,我检查v_due_date_new是哪一天。如果是星期六或星期天,我再加两天。
发布于 2014-09-18 12:09:14
像这样的事情应该有效:
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;https://stackoverflow.com/questions/25910897
复制相似问题