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')

来固定
  1. 检查 admin_idstatus_id 列中的值。确保它们是正确的数据类型。

  2. 你能重新排列下面的查询并检查输出吗?尽量使用join代替嵌套查询来提高数据库的性能:

    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. 这是针对类似问题的 link: (Whosebug)

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

  • date_created 是一个 timestamp,具有亚秒精度的 6 个小数位。
  • 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 ) )