如何调整SQL查询:无季度/月参数时查询本年至当前月数据
需求实现方案:调整SQL日期过滤逻辑
需求核心
:P_YEAR参数始终传入当前年份- 当
:P_QUARTER和:P_MONTH均未传入(值为NULL或'All')时,查询本年1月至当前自然月的数据 - 若传入了
:P_QUARTER或:P_MONTH任一参数,则沿用原查询逻辑
可实现性结论
完全可以实现,通过在WHERE子句中添加条件分支即可区分两种场景,以下是修改后的SQL:
SELECT Max(acrl2.accrual_period) FROM anc_per_accrual_entries acrl2 WHERE person_id = paam.person_id AND acrl2.plan_id = appe.plan_id AND acrl2.PER_ACCRUAL_ENTRY_ID = dtl.PER_ACCRUAL_ENTRY_ID AND TO_CHAR(acrl2.accrual_period, 'yyyy') = :P_YEAR -- 简化年份过滤,因:P_YEAR始终为当前年 AND ( -- 场景1:未传入季度/月份参数,查询本年1月至当前月 ( (:P_QUARTER IS NULL OR :P_QUARTER = 'All') AND (:P_MONTH IS NULL OR :P_MONTH = 'All') AND acrl2.accrual_period >= TO_DATE(:P_YEAR || '-01-01', 'yyyy-mm-dd') AND acrl2.accrual_period <= LAST_DAY(TRUNC(SYSDATE, 'MM')) ) OR -- 场景2:传入季度/月份参数,沿用原逻辑 ( ( (TO_CHAR(acrl2.accrual_period, 'yyyy') || ' Q ' || TO_CHAR(acrl2.accrual_period, 'Q')) IN (:P_QUARTER) OR 'All' IN (:P_QUARTER || 'All') ) AND ( (TO_CHAR(acrl2.accrual_period, 'yyyy') || '/' || TO_CHAR(acrl2.accrual_period, 'mm')) IN (:P_MONTH) OR 'All' IN (:P_MONTH || 'All') ) ) )
关键逻辑说明
- 年份过滤简化:由于
:P_YEAR始终传入当前年,原逻辑中OR 'All'的冗余判断可以直接移除,直接匹配年份相等即可。 - 双场景分支:通过
OR将两种查询逻辑拆分:- 当季度和月份参数均为
NULL或'All'时,触发日期范围过滤,限定为本年1月至当前月的最后一天。 - 只要任一参数传入了非
'All'的值,就会触发原有的季度、月份匹配逻辑。
- 当季度和月份参数均为
- 日期范围准确性:使用
TO_DATE构造本年1月1日,LAST_DAY(TRUNC(SYSDATE, 'MM'))获取当前月的最后一天,确保覆盖当前月内的所有数据。
内容的提问来源于stack exchange,提问作者Sree
相关产品推荐
相关产品推荐

