以日期为准,往前推X天工作日的日期

--*******************************************************************************
--功能说明: 以日期为准,往前推X天工作日的日期
--取ntl_ot_work_calendar表来确定该日期是否在表中存在:
--如果该记录在表中存在,判断是否为工作日;
--如果该记录在表中不存在,则默认为工作日
--参数说明:假设传入2012-09-10号,2天,得到日期为2012-09-06(7号,8号为休息日)
--调用函数:
--修改记录:
--******************************************************************************/
FUNCTION FUN_GET_DATE_BY_WORK_DAY(P_CHANGE_DATE IN DATE,
P_WORK_DAYS IN NUMBER)
RETURN NTL_OT_WORK_CALENDAR.DATE_CALENDAR%TYPE IS
V_CHANGE_DATE NTL_OT_WORK_CALENDAR.DATE_CALENDAR%TYPE;
FLAG_WORK_DAY BOOLEAN := TRUE;
V_FIND_RECORD NUMBER(2) := 0;
V_FIND_WORKDAY_RECORD NUMBER(2) := 0;
V_DAYS NUMBER(2) := -1;
V_LOGIC_DATE NTL_OT_WORK_CALENDAR.DATE_CALENDAR%TYPE;
BEGIN
IF (P_CHANGE_DATE IS NOT NULL) THEN
V_LOGIC_DATE := P_CHANGE_DATE;
ELSE
V_LOGIC_DATE := TRUNC(SYSDATE);
END IF;
WHILE FLAG_WORK_DAY LOOP
select COUNT(1)
INTO V_FIND_RECORD
from NTL_OT_WORK_CALENDAR T
WHERE TRUNC(T.DATE_CALENDAR) = TRUNC(V_LOGIC_DATE);
--说明该日期在日历设置表中存在
IF (V_FIND_RECORD <> 0) THEN
select COUNT(1)
INTO V_FIND_WORKDAY_RECORD
from NTL_OT_WORK_CALENDAR T
WHERE TRUNC(T.DATE_CALENDAR) = TRUNC(V_LOGIC_DATE)
AND T.IS_WORKDAY = '1';
--说明该日期为工作日
IF (V_FIND_WORKDAY_RECORD <> 0) THEN
V_CHANGE_DATE := TRUNC(V_LOGIC_DATE);
V_DAYS := V_DAYS + 1;
END IF;
ELSE
V_CHANGE_DATE := TRUNC(V_LOGIC_DATE);
V_DAYS := V_DAYS + 1;
END IF;
IF (V_DAYS = P_WORK_DAYS) THEN
FLAG_WORK_DAY := FALSE;
END IF;
V_LOGIC_DATE := V_LOGIC_DATE - 1;
END LOOP;
RETURN V_CHANGE_DATE;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END FUN_GET_DATE_BY_WORK_DAY;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值