指定日期范围有效税率查询SQL异常:预期三条结果缺失一条
税率查询SQL逻辑修正
原SQL的NOT EXISTS子句逻辑错误,导致valid_from = '2023-01-01'的记录被误过滤。这条记录的valid_to为NULL,实际有效截止日期是下一条税率的valid_from(2024-07-01)减1天(2024-06-30),该时间段完全落在查询范围(2022-07-01至2024-12-31)内,本应被返回,但原SQL中因为存在后续税率记录,NOT EXISTS条件不成立,所以被排除。
修正后的SQL
使用窗口函数LEAD计算每条税率记录的实际有效截止日期,再判断该日期范围与查询区间是否有重叠:
SELECT valid_from, valid_to, rate FROM ( SELECT t.*, -- 计算实际有效截止日期:优先用valid_to;无则取下一条税率的生效日减1天;无下一条则用查询结束日 COALESCE( t.valid_to, LEAD(t.valid_from) OVER (ORDER BY t.valid_from) - INTERVAL 1 DAY, '2024-12-31' ) AS actual_valid_to FROM taxes t ) AS tax_with_actual_end WHERE -- 记录生效日不晚于查询结束日 valid_from <= '2024-12-31' -- 实际有效截止日不早于查询起始日 AND actual_valid_to >= '2022-07-01';
修正逻辑说明
- 计算实际有效截止日期:用
LEAD窗口函数获取当前记录的下一条税率生效日期,以此确定valid_to为NULL的记录的实际截止日期(下一条生效日减1天);对无后续税率的记录,实际截止日期设为查询结束日。 - 筛选重叠区间:保留生效日不晚于查询结束日、且实际截止日不早于查询起始日的记录,确保记录的有效区间与查询范围存在重叠。
执行该SQL后会返回全部三条预期记录:
- 2022-01-01至2022-12-31的税率,覆盖查询范围的2022-07-01至2022-12-31;
- 2023-01-01至2024-06-30的税率,覆盖查询范围的2023-01-01至2024-06-30;
- 2024-07-01至2024-12-31的税率,覆盖查询范围的2024-07-01至2024-12-31。
内容的提问来源于stack exchange,提问作者root66
相关产品推荐
相关产品推荐

