Oracle 按工作日计算工单超期日期(跳过法定节假日)
一、创建辅助表:用于存储 法定节假日调休日
create table TEMP_JJRTXR ( rq DATE not null, lx NUMBER not null, zt NUMBER not null ) tablespace USR_xxx_TBS pctfree 10 initrans 1 maxtrans 255; -- Add comments to the table comment on table TEMP_JJRTXR is '临时_节假日调休日'; -- Add comments to the columns comment on column TEMP_JJRTXR.rq is '日期'; comment on column TEMP_JJRTXR.lx is '类型:1=节假日,2=调休后补工作日'; comment on column TEMP_JJRTXR.zt is '状态:1=正常,0=废弃'; -- Create/Recreate indexes create unique index TEMP_JJRTXR_RQ on TEMP_JJRTXR (RQ) tablespace USR_HNMP_TBS pctfree 10 initrans 2 maxtrans 255 nologging;
二、百度搜索节假日、调休日数据导入上表
三、创建辅助函数
-- 辅助函数:判断是否是工作日:Y/N CREATE OR REPLACE FUNCTION IS_WORK_DATE( IN_RQ IN DATE ) RETURN VARCHAR2 AS T_IS_WORK_DATE VARCHAR2(10):=''; BEGIN SELECT CASE WHEN ( TO_CHAR(IN_RQ, 'D') NOT IN (7, 1) AND IN_RQ NOT IN (SELECT RQ FROM TEMP_JJRTXR WHERE LX=1 ) ) OR ( TO_CHAR(IN_RQ, 'D') IN (7, 1) AND IN_RQ IN (SELECT RQ FROM TEMP_JJRTXR WHERE LX=2 ) ) THEN 'Y' ELSE 'N' END INTO T_IS_WORK_DATE FROM DUAL; RETURN T_IS_WORK_DATE; END; -- 获取工单超时日期 CREATE OR REPLACE FUNCTION FUN_GET_OUT_DATE( IN_RQ IN DATE, IN_COUNT IN NUMBER ) /* 辅助函数: 按指定日期,跳过节假日,累加指定天数 返回:超期日期 */ RETURN DATE AS T_OUT_DATE DATE:=IN_RQ; T_IS_WORK_DATE VARCHAR2(10):='N'; BEGIN FOR I IN 1..IN_COUNT LOOP WHILE T_IS_WORK_DATE='N' LOOP T_OUT_DATE := T_OUT_DATE + 1; SELECT IS_WORK_DATE(T_OUT_DATE) INTO T_IS_WORK_DATE FROM DUAL; /*IF T_IS_WORK_DATE='Y' THEN DBMS_OUTPUT.put_line(T_OUT_DATE); DBMS_OUTPUT.put_line(T_IS_WORK_DATE); END IF;*/ END LOOP; T_IS_WORK_DATE:='N'; END LOOP; RETURN T_OUT_DATE; END;
四、根据工单创建日期与限制天天数,获取超期日期
SELECT FUN_GET_OUT_DATE(TO_DATE('2021-01-01','YYYY-MM-DD'),10) FROM DUAL;
好的代码像粥一样,都是用时间熬出来的
浙公网安备 33010602011771号