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: 无效的数字,但数据类型是日期,它不会以任何方式接受它的主要内容,如果未能解决你的问题,请参考以下文章
仅在案例语句中添加年份得到无效数字错误 - ORA-01722
oracle SQL Developer 显示数字数据类型为空,而 Length 函数显示 ORA-01722:无效数字