簡體   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