sql - SQL 查询以 <= 而不是 in 传递多个参数

我正在传递两个参数 - 月份和年份

月份可以是 01/2022、02/2022、03/2022 等 年份可以是 2022、2021、2020

年份是必填项

我在查询中有一个比较这些 dates 的条件 -

SELECT Max(acrl2.accrual_period)
FROM   anc_per_accrual_entries acrl2
WHERE  person_id = 123
AND    acrl2.plan_id = 1678
acrl2.accrual_period
and to_char(acrl2.accrual_period,'yyyy') = NVL(:p_year,to_char(acrl2.accrual_period,'yyyy'))
AND    acrl2.accrual_period <= Nvl((
       CASE
              WHEN :p_month IS NOT NULL 
              THEN To_date(To_char(Last_day(To_date(:p_month, 'yyyy/mm')), 'yyyymmdd'), 'yyyymmdd')
              WHEN :p_year IS NOT NULL 
              THEN To_date(:p_year  || '1231', 'yyyymmdd')            
       END) ,sysdate)

当我过了一个月——比如 01/2022——我得到了正确的输出。或者当我刚过 2021 年时,我得到了输出。问题是当我选择多个月份 01/2022、02/2022 或 2021,2022 时。

我知道我可以使用 in 子句。但我无法将它与 <= 一起使用

回答1

不确定在满足条件时您期望什么,但这里是您可以对条件本身执行的操作。 Case 的工作方式是接受第一个 WHEN 条件满足结束退出。因此,如果第一个当 cond 为真时,则根本不考虑第二个。我将两个(月,年)分开进行测试。还有一个 INSTR 函数可以测试 p_month 和 p_year。

SELECT 
    Max(acrl2.accrual_period)
FROM   
    anc_per_accrual_entries acrl2
WHERE  
    person_id = 123 And
    acrl2.plan_id = 1678 And 
    TRUNC(acrl2.accrual_period, 'dd') <= (CASE
                                            WHEN Instr(:p_month, To_Char(acrl2.accrual_period, 'mm/yyyy')) > 0
                                                THEN To_Date(To_char(Last_day(acrl2.accrual_period), 'yyyymmdd'), 'yyyymmdd')
                                          END) And 
    TRUNC(acrl2.accrual_period, 'dd') <= (CASE
                                            WHEN Instr(:p_year, To_Char(acrl2.accrual_period, 'yyyy')) > 0
                                                THEN To_Date(To_char(acrl2.accrual_period, 'yyyy') || '1231', 'yyyymmdd')
                                        END)

相似文章

html - 不知道如何更改 html 的背景

我不知道如何更改html的背景。这不仅仅是您可以替换的图片。有人可以指出我应该照顾的部分吗?我得到的只是一些css文件和图像文件夹。我一直在寻找一段时间,我有几个小时向某人介绍这个网站,我不喜欢它的蓝...

最新文章