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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用