Oracle PLSQL 校验客户端日期区间与tbl_1日期范围匹配的实现方案咨询
实现方案
不建议使用while循环实现该需求,直接使用SQL集合运算即可,性能更高、逻辑更简洁,避免循环带来的性能损耗(尤其是客户端传入的日期范围较大的场景)。
核心逻辑
我们只需要对比两个数值是否相等即可得出结果:
- 客户端传入的日期区间总天数
- 该区间内所有被
tbl_1存储的日期区间覆盖的去重天数
两者相等则返回true,存在未覆盖日期则返回false。
注意事项
你库中存储的日期格式为dd.mm.yyyy.,需要先转为数据库可识别的日期类型再做运算,不同数据库的日期转换函数不同:
- MySQL使用
STR_TO_DATE(字段名, '%d.%m.%Y.') - PostgreSQL使用
TO_DATE(字段名, 'dd.mm.yyyy.') - SQL Server使用
CONVERT(DATE, 字段名, 104)
代码示例(MySQL 8.0+ 版本)
用递归CTE生成客户端日期区间的所有日期,无需手动写循环:
WITH RECURSIVE client_date_list AS ( -- 替换为客户端传入的起始日期参数 SELECT STR_TO_DATE(:date_from_client, '%d.%m.%Y.') AS cur_date UNION ALL SELECT cur_date + INTERVAL 1 DAY FROM client_date_list -- 替换为客户端传入的结束日期参数 WHERE cur_date < STR_TO_DATE(:date_to_client, '%d.%m.%Y.') ) SELECT COUNT(*) = (SELECT DATEDIFF(MAX(cur_date), MIN(cur_date)) + 1 FROM client_date_list) AS check_result FROM client_date_list cdl WHERE EXISTS ( SELECT 1 FROM tbl_1 t WHERE cdl.cur_date BETWEEN STR_TO_DATE(t.date_from, '%d.%m.%Y.') AND STR_TO_DATE(t.date_to, '%d.%m.%Y.') );
低版本兼容方案
如果使用不支持CTE的低版本数据库,可以提前构建一张数字辅助表存储连续整数,用辅助表生成日期序列,逻辑和上面一致,同样不需要使用while循环。
内容的提问来源于stack exchange,提问作者user_odoo
相关产品推荐
相关产品推荐

