在Oracle查询中的case语句中传递Bind Variable



我想在Case语句中传递Bind变量(日期(,以实现以下目标:当用户输入一个日期,如果该日期是星期一,那么Case语句应该获取星期五的值(这意味着它应该绕过周末,寻找前一个工作日的值(

我尝试使用以下查询,当我使用"sysdate"时,它运行良好

Select * from table_name
Where tradedate = trunc (sysdate - case to_char(sysdate, 'Dy') 
when 'Mon' then 3 else 1 end);

但是当我用绑定变量替换"sysdate"时,它会给我一个错误,比如:

tradedate = trunc (:sysdate1 - case to_char(:sysdate2, 'Dy') 
when 'Mon' then 3 else 1 end);

ORA-00932:不一致的数据类型:预期的DATE得到NUMBER00932.00000-";不一致的数据类型:预期的%s得到%s";

我们不能在oracle查询的Case语句中使用Bind Variables吗?如果是的话,有人能给我上述问题的任何替代解决方案吗?

如有任何帮助,我们将不胜感激。

以下是完整的代码:

select * from (
SELECT
S."TRADEDATE",S."ACCOUNT_NAME",S."BOOKING_AMOUNT",S."ACCOUNT_NUMBER",(CASE WHEN BOOKING_AMOUNT <0 THEN S."CREDIT" ELSE S."DEBIT" END) AS "DEBIT" , (CASE WHEN BOOKING_AMOUNT <0 THEN S."DEBIT"  ELSE S."CREDIT" END) AS "CREDIT",
U.VALUE_DT , U.AC_NO , NVL(U.BOOKED_AMOUNT ,0) BOOKED_AMOUNT
FROM
SXB S
FULL OUTER JOIN UBS U ON
S.ACCOUNT_NUMBER = U.AC_NO
AND
S.TRADEDATE = U.VALUE_DT

UNION ALL
SELECT
BOOKING_DATE TRADEDATE,
'SAXO RECON' ACCOUNT_NAME,
SUM((Case when DR_CR_INDICATOR = 'D' then AMOUNT*-1 when DR_CR_INDICATOR = 'C' then AMOUNT end)) BOOKING_AMOUNT,
EXTERNAL_ACCOUNT ACCOUNT_NUMBER,
'Matched - ' ||A.MATCH_INDICATOR AS DEBIT,
NULL AS CREDIT,
VALUE_DATE VALUE_DT,
NULL AS AC_NO,
0 AS BOOKED_AMOUNT
FROM
FCUBS.RETB_EXTERNAL_ENTRY A
WHERE A.EXTERNAL_ENTITY = 'SAXODKKKXXX'
AND A.EXTERNAL_ACCOUNT = '78600/COMMEUR'
group by
BOOKING_DATE ,
EXTERNAL_ACCOUNT ,
VALUE_DATE,
MATCH_INDICATOR
order by tradedate, account_name)
where tradedate = trunc (:sysdate1 - case to_char(:sysdate2, 'Dy') when 'Mon' then 3 else 1 end);

SYSDATE是一个日期数据类型,因此oracle将始终将其视为date数据类型。对于绑定变量,我会使用TO_DATE(:bind_var,'FORMAT_MASK'(进行显式转换。例如:

select 
case TO_CHAR(TO_DATE(:sysdate2,'DD-MON-YYYY'), 'Dy') when 'Mon'
then 3 
else 1 
end from dual

最新更新