ORA-01858:在应为数字的位置找到了非数字字符



我是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。可以将其用作字符to_char(date_created,'DD/MM/YYYY')来固定日期

to_date(date_created, 'DD-MM-YYYY')没有什么意义。

  • date_created是一个timestamp,具有6位小数位数,精度为亚秒
  • to_date取一个字符串。因此,Oracle必须首先使用会话的nls_timestamp_format将时间戳转换为字符串。这是发送到to_date的字符串
  • CCD_ 8然后尝试使用"0"将该字符串转换回CCD_;DD-MM-YYYY";格式掩码。除非nls_timestamp_format设置为这种情况,否则转换将失败,并可能引发您报告的错误

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

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

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

  2. 你能重新排列下面的查询并检查输出吗。尽可能使用联接而不是嵌套查询来提高数据库的性能:

    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. 这里有一个类似问题的链接:获取错误-ORA-01858:在需要数字的地方发现了一个非数字字符(堆栈溢出(

最新更新