我传递了两个参数-月和年
Month可以是01/2022、02/2022、03/2022等年份可以是2022、2021、2020
年份必填
我在查询中有一个条件来比较这些日期-
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)
当我通过一个月-说1/2022 -我得到正确的输出。或者当我过了2021年,我得到了一个输出。问题是当我选择多个月01/2022,02/2022或2021,2022。
我知道我可以用in从句。但是我不能使用<=
不确定在满足条件时期望得到什么,但这里是您可以对条件本身做的事情。Case的工作方式是接受满足第一个WHEN条件的end退出。因此,当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)