Where句を持つ機能的なselectステートメントがあります。where句には次のようなステートメントがあります...
to_date(camp.start_date、 'MM/DD/YYYY')> = to_date(:from_date、 'YYYY-MM-DD HH24:MI:SS')
ただし、camp.start_dateがNULLまたは行がない場合は、例外がスローされます-
ORA-01858:数値が必要な場所に数値以外の文字が見つかりました
camp.start_dateは、実際には日付に変換する必要があるVARCHAR2です(はい、おそらく日付フィールドである必要があることはわかっていますが、これを変更するオプションはありません)。
私はこのようなことを試みました...
to_date(NVL(camp.start_date,SYSDATE), 'MM/DD/YYYY') >=
to_date(:from_date, 'YYYY-MM-DD HH24:MI:SS')
それでもエラーが発生します。また試した
ここで、camp.start_dateはnullではなく、to_date(camp.start_date、 'MM/DD/YYYY')> = to_date(:from_date、 'YYYY-MM-DD HH24:MI:SS')
同じ問題。これを回避する最善の方法は何ですか?基本的に、camp.start_dateが有効な日付でない場合、to_dateは爆発し、エラーをスローします。
start_date
がNULLの場合、例外はスローされません。
select to_date( null, 'mm/dd/yyyy' )
from dual
nULLを返す完全に有効なSQLステートメントです。
発生しているエラーは、start_date
列の行の少なくとも一部が、実際には期待する形式の文字列ではないか、無効な日付にマップされていることを強く示しています(つまり、文字列'13/35/2007 ')。文字列を日付に変換して、変換された日付またはNULLを返すことができるかどうかをテストする関数を作成できます。その後、to_date
の代わりにそれを使用できます。
CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2,
p_format IN VARCHAR2 )
RETURN DATE
IS
BEGIN
RETURN to_date( p_str, p_format );
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END;
次に、my_to_date
の代わりにto_date
を使用します。それはあなたが得ているエラーを排除するはずです。ただし、無効な文字列を取り除くために、データをクリーンアップすることをお勧めします。
次のように使用できます。
NVL(TO_CHAR(SYSDATE,'DD-MM-YYYY'),' ')
これにより、日付が文字列形式に変換されてから、空の文字列に変換されます。
Sysdateを有効なchar文字列形式に変換する必要があります。
to_date(NVL(start_date,to_char(SYSDATE,'MM/DD/YYYY')), 'MM/DD/YYYY') >=
to_date(from_date, 'YYYY-MM-DD HH24:MI:SS')