2011-12-03 40 views
1

我試圖在Oracle中創建一個觸發器來比較兩個日期,然後刪除記錄,如果兩個日期的差異低於一定的價值。我有一個格式爲「DD-MON-YYYY HH24MI」的完整日期值,然後對於第二個日期值,我想要將'DD-MON-YYYY'值與'HH24MI'值連接起來。Oracle/SQL:將日期和時間連接成單個日期值時的數字格式模型無效

我得到的問題是,當我嘗試使用to_char將日期和時間值連接在一起,然後對該返回的值使用to_date時,它給了我一個ORA-01481無效數字格式錯誤。下面是觸發器本身的相關行。如果任何人都可以幫助我,這將不勝感激!

CREATE OR REPLACE TRIGGER dateTrig 
... 
DECLARE 
    day date; 
    ftime date; 
    CURSOR c_table1 IS SELECT ...; 
BEGIN 
FOR entry IN c_table1 LOOP 
    day := to_date(entry.fdate); 
    ftime := to_date(to_char(day, 'DD-MON-YYYY') || ' ' || to_char(entry.dtime, 'HH24MI'), 'DD-MON-YYYY HH24MI'); -- this is the line that is causing the error 
    dbms_output.put_line(day || ', ' || ftime); 
END LOOP; 
END; 
/
+1

DTIME列的數據類型是什麼?你的代碼假設它是一個日期。但我懷疑它是。 – Codo

+0

DTIME是一個varchar(4),在下午4點看起來像'1600',下午3:30看起來像'1530',等等。 – jsutton

回答

2

的自DTIME不是日期類型,你不能用日期格式使用TO_CHAR。如果零填充爲4個字符長度,則可以這樣簡化:

ftime := to_date(to_char(day, 'DD-MON-YYYY') || ' ' || entry.dtime, 'DD-MON-YYYY HH24MI'); 
+0

這是正確的解決方案,謝謝。 – jsutton

0

我覺得你最好避免使用TO_CHAR的,如果你可以,儘量堅持,在他們本土的日期格式返回值的函數,這樣你也可以不必在你的字符串運行TO_DATE命令,可能有一些成功與以下或有密切的關係吧:

ftime := Trunc(Sysdate) || ' ' || Extract(Hour From entry.dtime) || ':' Extract(Minute From entry.dtime) 

祝您好運

+0

我改變了我的界線,像沒有運氣一樣。我得到一個\t ORA-01830:日期格式圖片在轉換整個輸入字符串之前結束。 day:= to_date(entry.fdate,'DD-MON-YYYY'); ftime:= day || ''|| to_date(entry.dtime,'HH24MI'); – jsutton

+0

啊道歉,我不知道你的Dtime被格式化爲一個varchar,這就是爲什麼Extract函數不起作用,Codo的答案是這種情況下的答案。 –

相關問題