2017-07-07 948 views
3
select 
to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as SCHEDULED_TIME, 
TRUNC(to_date(to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF'),'YYYY-MM-DD HH24:MI:SS')) 
from S_TIDAL_STATUS 

錯誤是: ORA-01830:日期格式圖象變換結束整個輸入串之前 01830. 00000 - 「日期格式圖象變換結束整個輸入字符串之前」PL SQL - 轉換時間戳的日期時間/日期

的目標是回到類似

2017-07-91 23時十四分00秒 (不點後的內容)。

下面介紹一下SCHEDULED_TIME(時間戳)看起來像: enter image description here

+0

嗨,你嘗試過** TO_CHAR(SCHEDULED_TIME」 YYYY-MM-DD HH24:MI:SS')**? – hmmftg

+0

您不需要PL/SQL。看起來像一個普通的SQL問題。 –

回答

1

這應該做的伎倆:

select 
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as time_to_csecs, 
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS') as time_to_secs, 
TRUNC(to_date(to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')) as time_to_day 
from S_TIDAL_STATUS 

請查閱文檔,看看TO_TIMESTAMP和TO_CHAR之間的差異。

+0

嗯什麼是它必須首先轉換爲字符串的原因?只是好奇 –

+0

@AnnaHuang如果您沒有將時間戳轉換爲字符串,則sqldeveloper將根據NLS_TIMESTAMP_FORMAT(對於時間戳)或NLS_DATE_FORMAT(對於日期)的當前設置顯示一個字符串。從本質上講,sqldeveloper(和sqlplus以及其他任何adhoc應用程序)將使用所選擇的Oracle API通過告知API執行轉換來將所有數據類型強制轉換爲字符串。換句話說,該應用程序告訴Oracle在原始(db)數據類型中返回字符串而不是值。它讓人們更容易編寫像sqldeveloper和sqlplus這樣的應用程序。 – jeff6times7

+0

@ jeff6times7 - 實際上它是Oracle數據庫引擎本身將執行隱式轉換,而不是前端(SQL Developer或SQL \ * Plus)。但否則解釋是正確的。 – mathguy

4

您嘗試的問題是函數TO_DATE()應用於時間戳。 TO_DATE()採用VARCHAR2(字符串)輸入,而不是時間戳。因此,Oracle首先使用您的NLS_TIMESTAMP_FORMAT參數隱式地將時間戳轉換爲字符串,然後嘗試將此字符串轉換爲日期。根據您的NLS_TIMESTAMP_FORMAT,您可能會得到不同的錯誤。

將時間戳轉換爲日期(datetime)的方法 - 截斷秒的小數部分 - 使用CAST函數。例如:

select systimestamp, 
     cast (systimestamp as date) as ts_cast_to_date 
from dual 
; 

另外,如果您的所有字符串正是以這種格式,你可以先截斷字符串和直接申請TO_DATE:

to_date(substr(scheduled_time, 1, 19), 'yyyy-mm-dd hh24:mi:ss')