web-dev-qa-db-ja.com

Oracle:to_dateでNULL値を回避する

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は爆発し、エラーをスローします。

5
HelloWorld

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を使用します。それはあなたが得ているエラーを排除するはずです。ただし、無効な文字列を取り除くために、データをクリーンアップすることをお勧めします。

10
Justin Cave

次のように使用できます。

NVL(TO_CHAR(SYSDATE,'DD-MM-YYYY'),' ')

これにより、日付が文字列形式に変換されてから、空の文字列に変換されます。

1
venkatesh

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')
1
Clint