ORA-01722: 无效的数字,但数据类型是日期,它不会以任何方式接受它

Posted

技术标签:

【中文标题】ORA-01722: 无效的数字,但数据类型是日期,它不会以任何方式接受它【英文标题】:ORA-01722: invalid number but datatype is date and it will not accept it in any way 【发布时间】:2020-02-03 07:29:19 【问题描述】:

还有一个不是数字的问题,只是想不通。

我的查询:

SELECT
    s.user_id,
    date_time, 
    to_char(Date_time, 'DD-MON-YYYY HH24:MI:SS') timestamp,
        ( SELECT DECODE
        FROM (  SELECT  DECODE, code
                FROM    codelist_decode
                WHERE   codelist_id = 5029
                AND language_code = 001
             ) t5
        WHERE  t5.code = s.operation_type) 
    AS operation,
        ( SELECT t1.module_name_internal
        FROM (  SELECT  module_name_internal, module_id
                FROM    aris_admin_module
              ) t1
        WHERE  s.module_id = t1.module_id
        ) 
    AS module,
    t.session_id,
    t.seq_admin_audit_trail,
    t.record_id,
        ( SELECT t4.field_name_e
          FROM (  SELECT  field_name_e, admin_field_id
                  FROM    aris_admin_table_field
                ) t4
          WHERE admin_field_id = t.field_id) 
    AS field_name,
        ( SELECT t2.DECODE
          FROM  (  SELECT  DECODE, code
                   FROM    aris_admin_audit_decode
                   WHERE   field_id = t.field_id
                ) t2
          WHERE  t2.code = to_number(t.old_value)) 
    AS org_value_yn,
    t.old_value,
        ( SELECT t3.DECODE
          FROM ( SELECT  DECODE, code
                 FROM    aris_admin_audit_decode
                 WHERE   field_id = t.field_id
                ) t3
          WHERE t3.code = to_number(t.new_value)) 
    AS new_value_yn
    ,t.new_value
FROM
    system_admin_audit_session   s,
    system_admin_audit_trail     t
WHERE s.session_id = t.session_id
--order by TO_NUMBER('s.session_id','9999999999')
--or order by to_date(s.date_time) 
order by 2

上面会产生错误: ORA-01722: 无效号码 01722. 00000 - “无效号码” *原因:指定的号码无效。 *操作:指定一个有效的数字。

我尝试在其他几列上订购,但同样的问题。 如果我简化查询,它可以正常工作:

select s.user_id,s.date_time
from ARISG_PROD.system_admin_audit_session s
order by 2 desc

那么为什么它不将我的日期时间识别为日期并接受订购?

【问题讨论】:

如果 s.date_time 已经是 DATE 数据类型,不要在其上使用 to_date()。这意味着 Oracle 需要执行到 VARCHAR2 的隐式转换,然后再返回到 DATE。如果要删除日期列的时间部分,请改用trunc() 【参考方案1】:

让我们看看我能不能帮到你。 通常,当将字符串与数字进行比较时,可能会发生此类错误。

所以,如果 s.module_id 是一个 varchar2 并且 t1.module_id 被定义为一个数字,那么这样的语句

s.module_id = t1.module_id

可能是根本原因。

我建议你把主select语句中的所有子查询都注释掉,然后尝试查询是否出现错误。

一旦错误消失,您必须分析比较语句。或者发在这里,我们看看

【讨论】:

有趣的是,当我删除解码子查询 org_value_yn 和 new_value_yn 时,它就可以工作了。我也尝试将别名放在表中的子查询上,但这仍然不起作用。但是,我可以在没有解码部分的情况下生活,所以没关系。谢谢你的帮助。 (不过我还是不太明白:o)) 我猜是这里的转换搞砸了:t2.code = to_number(t.old_value)) @kristian 这里还有另外 3 个嫌疑人:1) codelist_id = 5029; 2) 语言代码 = 001; 3) field_id = t.field_id 尝试使用所有 4 个来逐步将它们注释掉。你会找到那个混蛋! 其他 3 个效果很好,我只需要过滤掉 2 个 to_number 转换。我可以在没有解码的情况下使用输出:) @kristian 很高兴听到我的想法有所帮助。

以上是关于ORA-01722: 无效的数字,但数据类型是日期,它不会以任何方式接受它的主要内容,如果未能解决你的问题,请参考以下文章

什么是“oracle ORA-01722”无效数字?

讨厌麻烦的ora 01722无效数字

仅在案例语句中添加年份得到无效数字错误 - ORA-01722

Oracle报错ORA-01722: 无效数字排查解决方案

ORA-01722:无效数字

oracle SQL Developer 显示数字数据类型为空,而 Length 函数显示 ORA-01722:无效数字