2011-12-03 3 views
1

2つの日付を比較し、2つの日付の差がa以下になるとレコードを削除するトリガーをOracleで作成しようとしています。一定の価値。私は 'DD-MON-YYYY HH24MI'の形式で完全な日付の値を持っていて、次に2番目の日付の値として 'DD-MON-YYYY'の値と 'HH24MI'の値を連結したいと思います。Oracle/SQL:日付と時刻を1つの日付の値に連結するときの数値書式が無効

問題は、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は、午後4時には '1600'、午後3時半には '1530'のように見えるvarchar(4)です。 – jsutton

答えて

2

のベスト

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

を、あなたは、日付形式でTO_CHARを使用することはできません。長さを4文字にした場合、次のように簡略化できます。

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

それは正しい解決策でした、ありがとう。 – jsutton

0

は、私はあなたがして、彼らのネイティブの日付の形式で値を返す関数であなたも、あなたの文字列にTO_DATEコマンドを実行する必要がない場合も、このように固執しようとすることができる場合TO_CHARの使用を避けるために最善を考えて、あなた以下でいくつかの成功またはそれと密接な関係があり:DTIMEが日付型ではないので、運

+0

私はあなたのようなものに私の行を変更しました。私は\t ORA-01830:入力文字列全体を変換する前に日付形式のピクチャが終了します。 日:= to_date(entry.fdate、 'DD-MON-YYYY'); ftime:= day || '' || to_date(entry.dtime、 'HH24MI'); – jsutton

+0

ああ、私はあなたのDtimeがvarcharとしてフォーマットされていることを知らなかったので、Extract関数がうまくいかず、Codoの答えがこのケースの答えです。 –

関連する問題