繁体   English   中英

ORA-01858: 在需要数字的地方发现了一个非数字字符

[英]ORA-01858: a non-numeric character was found where a numeric was expected

我是 oracle 的初学者,需要有关以下查询的帮助:

select admin_id, to_date(date_created, 'DD-MM-YYYY'), name, mobile, email, (select status from status where status.status_id = admin.status_id) from admin;

这是我的表:

SQL> desc admin
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ADMIN_ID                  NOT NULL NUMBER(5)
 STATUS_ID                 NOT NULL NUMBER(5)
 DATE_CREATED                       TIMESTAMP(6)
 STATUS_DATE                        DATE
 NAME                           VARCHAR2(45)
 MOBILE                         VARCHAR2(20)
 EMAIL                          VARCHAR2(110)

SQL> desc status
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 STATUS_ID                 NOT NULL NUMBER(5)
 STATUS                         VARCHAR2(36)

主要问题是我想根据 admin.status_id 获取 status.status。 日期可以通过将其用作 char to_char(date_created,'DD/MM/YYYY')来固定

to_date(date_created, 'DD-MM-YYYY')没有多大意义。

  • date_created是具有亚秒精度的 6 位十进制数字的timestamp
  • to_date接受一个字符串。 所以 Oracle 必须首先使用会话的nls_timestamp_format将时间戳转换为字符串。 那是发送到to_date的字符串。
  • to_date然后尝试使用“DD-MM-YYYY”格式掩码将该字符串转换回date (始终具有时间组件)。 除非这恰好是您的nls_timestamp_format设置的内容,否则该转换将失败并且可能会抛出您报告的错误。

如果所有这些转换都有效,您最终会向 Java 应用程序发送一个将时间设置为午夜的日期。 但是,作为一般规则,通常将时间戳发送回 Java 应用程序并让它处理如何将其转换为字符串以及需要显示时间戳的哪些组件会更有意义。 所以我的默认设置是 select date_created

如果您确实希望 Oracle 进行数据类型转换并将date的时间部分设置为午夜,则可以使用trunccast代替。 这避免了隐式数据类型转换并消除了对会话的nls_timestamp_format的依赖。

trunc( cast( date_created as date ) )
  1. 检查admin_idstatus_id列中的值。 确保它们是正确的数据类型。

  2. 您能否重新排列下面的查询并检查 output。 尽量使用连接而不是嵌套查询来提高数据库的性能:

     select ad.admin_id, to_date(ad.date_created, 'DD-MM-YYYY'), ad.name, ad.mobile, ad.email,st.status from admin ad,status st where ad.admin_id=st.status_id;
  3. 以下是类似问题的链接: Getting Error - ORA-01858: a non-numeric character was found where a numeric is expected (Stackoverflow)

ORA-01858: a non-numeric character was found where a numeric was expected
select ad.admin_id, to_date(ad.date_created, 'DD-MM-YYYY'), 
       ad.name, ad.mobile, ad.email,st.status  
from admin ad,status st 
where ad.admin_id=st.status_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM