ORA-00932:不一致的数据类型:预期数字在oracle存储过程中获得DATE

ac1kyiln  于 2022-12-18  发布在  Oracle
关注(0)|答案(4)|浏览(260)

我在Oracle存储过程中使用了以下查询,在该过程中,我得到了以下错误

ORA-00932: inconsistent datatypes: expected NUMBER got DATE.

day_id列是数字数据类型,数据存储在此列中,例如20110822; ltds列是日期数据类型,值存储在此列中,例如08-AUG-17。这两列都存储实际日期。
在我的存储过程中,我把这个查询放在变量中,如下所示:

NESS_QUERY:= select t.day_id from M_TIME t 
where TO_DATE (t.day_id, ''YYYYMMDD'') < trunc('''||LTDS||''') and 
TO_DATE (t.day_id, ''YYYYMMDD'') >= trunc(sysdate, ''mm'') - case trunc('''||LTDS||''') when trunc(sysdate, ''mm'') then 1 else 0 end;

DBMS_OUTPUT.PUT_LINE (NESS_QUERY);

DBMS_OUTPUT.PUT_LINE的输出如下所示:

select t.day_id from M_TIME t 
where TO_DATE (t.day_id, 'YYYYMMDD') < trunc('15-DEC-17') and 
TO_DATE (t.day_id, 'YYYYMMDD') >= trunc(sysdate, 'mm') - case trunc('15-DEC-17') when trunc(sysdate, 'mm') then 1 else 0 end

busg9geu

busg9geu1#

如果您对该列的数据类型选择有任何影响,请将其更改为DATE数据类型。这将使事情(如您试图运行的查询)变得更容易。
由于您的列当前不是DATE数据类型,因此如果要将该列的内容与日期进行比较,则需要通过to_date()沿着适当的格式掩码转换该列。在您的情况下,格式掩码看起来是yyyymmdd
因此,您的查询应该是这样的:

select t.day_id
from   m_time t
where  to_date(t.day_id, 'yyyymmdd') >= trunc(sysdate, 'mm') - case trunc(ltds) when trunc(sysdate, 'mm') then 1 else 0 end;
u5rb5r59

u5rb5r592#

在引起错误的条件下,

t.day_id >= trunc(sysdate, 'mm')

day_id是数字,trunc(sysdate,'mm')返回日期数据类型

qacovj5a

qacovj5a3#

在比较之前,应使用TO_DATEday_id转换为date

SELECT t.day_id
  FROM M_TIME t
 WHERE TO_DATE (t.day_id, 'YYYYMMDD') >=
            TRUNC (SYSDATE, 'mm')
          - CASE TRUNC (ltds) WHEN TRUNC (SYSDATE, 'mm') THEN 1 ELSE 0 END;

EDIT:您不需要在查询中使用ldts变量,您可以保存它并在其他地方使用它,但对于查询,您可以从cte定义它并重用它。

WITH l AS (SELECT TRUNC (LOAD_DATE) LDTS FROM JOB_EXE)
SELECT t.day_id
  FROM M_TIME t CROSS JOIN l
 WHERE     TO_DATE (t.day_id, 'YYYYMMDD') < l.LDTS
       AND TO_DATE (t.day_id, 'YYYYMMDD') >=
                TRUNC (SYSDATE, 'mm')
              - CASE l.LDTS WHEN TRUNC (SYSDATE, 'mm') THEN 1 ELSE 0 END
tyg4sfes

tyg4sfes4#

where (t.day_id, 'YYYYMMDD') < trunc('31-DEC-23') and 
TO_DATE (t.day_id, 'YYYYMMDD') >= trunc(sysdate, 'mm') - case trunc('01-Jan-23') when trunc(sysdate, 'mm') then ('Yes') else ('No') end

相关问题