You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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')
        )
    )
)

关键逻辑说明

  1. 年份过滤简化:由于:P_YEAR始终传入当前年,原逻辑中OR 'All'的冗余判断可以直接移除,直接匹配年份相等即可。
  2. 双场景分支:通过OR将两种查询逻辑拆分:
    • 当季度和月份参数均为NULL或'All'时,触发日期范围过滤,限定为本年1月至当前月的最后一天。
    • 只要任一参数传入了非'All'的值,就会触发原有的季度、月份匹配逻辑。
  3. 日期范围准确性:使用TO_DATE构造本年1月1日,LAST_DAY(TRUNC(SYSDATE, 'MM'))获取当前月的最后一天,确保覆盖当前月内的所有数据。

内容的提问来源于stack exchange,提问作者Sree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:24:22