如何基于日期范围及调度类型向Oracle表插入对应调度记录
Oracle 调度记录插入实现方案
前置说明
- 传入的起始日期、结束日期默认格式为
DD/MM/YYYY,可根据实际业务调整格式掩码 - 假设存储调度记录的表为
scheduler_table,存储调度日期的字段为scheduled_date - 调度类型参数支持不区分大小写传入
实现规则
根据调度类型的不同,日期生成步进规则如下:
- Daily(每日):从上一个生成日期往后加1天
- Weekly(每周):从上一个生成日期往后加7天
- Monthly(每月):从上一个生成日期往后加1个月
- Annually(每年):从上一个生成日期往后加1年
完整实现代码
直接用Oracle递归查询生成符合要求的日期序列,可一次性完成插入,性能优于循环遍历写法:
INSERT INTO scheduler_table (scheduled_date) WITH input_param AS ( -- 三个:p开头的变量为入参占位符,实际调用时替换为传入值即可 SELECT TO_DATE(:p_from_date, 'DD/MM/YYYY') AS from_date, TO_DATE(:p_to_date, 'DD/MM/YYYY') AS to_date, UPPER(:p_schedule_type) AS schedule_type FROM DUAL ) SELECT CASE ip.schedule_type WHEN 'DAILY' THEN ip.from_date + (LEVEL - 1) WHEN 'WEEKLY' THEN ip.from_date + (LEVEL - 1)*7 WHEN 'MONTHLY' THEN ADD_MONTHS(ip.from_date, LEVEL - 1) WHEN 'ANNUALLY' THEN ADD_MONTHS(ip.from_date, (LEVEL - 1)*12) END AS scheduled_date FROM input_param ip CONNECT BY CASE ip.schedule_type WHEN 'DAILY' THEN ip.from_date + (LEVEL - 1) WHEN 'WEEKLY' THEN ip.from_date + (LEVEL - 1)*7 WHEN 'MONTHLY' THEN ADD_MONTHS(ip.from_date, LEVEL - 1) WHEN 'ANNUALLY' THEN ADD_MONTHS(ip.from_date, (LEVEL - 1)*12) END <= ip.to_date; COMMIT;
效果验证
日调度场景验证
传入参数:起始日期01/01/2021,结束日期25/01/2021,调度类型Daily
会生成2021年1月1日到2021年1月25日之间所有自然日的记录,和示例要求一致。
周调度场景验证
传入参数:起始日期01/01/2021,结束日期25/01/2021,调度类型Weekly
会生成01/01/2021、08/01/2021、15/01/2021、22/01/2021四条记录,和示例要求一致。
内容的提问来源于stack exchange,提问作者TDApower
相关产品推荐
相关产品推荐

