Oracle SQL 関数 : TO_DATE : 文字列の日付型へ変換

 dateRet := TO_DATE( stringSrc [ , stringFormat [ , nlsParam ] ] );

 TO_DATEは文字列型データstringSrcを日付書式stringFormatに従ってDATE型のデータを返します。
  stringFormatを指定しない場合はデフォルトの日付書式に従います。
  nlsParamは月、日の名称及び略称の言語を指定します。
SQL> SELECT TO_DATE('2002/10/01 12:30:00','YYYY/MM/DD HH24:MI:SS'),
  2         TO_CHAR(TO_DATE('2002/10/01 12:30:00','YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS')
  3  FROM DUAL;

TO_DATE( TO_CHAR(TO_DATE('20
-------- -------------------
02-10-01 2002/10/01 12:30:00


TO_DATE 関数は「stringSrc」が日付文字列として正しくない場合以下の様にエラーが発生します。

SQL> SELECT
  2      TO_DATE('2002/99/01 12:30:00','YYYY/MM/DD HH24:MI:SS')  "日付文字列エラー"
  3  FROM DUAL;
    TO_DATE('2002/99/01 12:30:00','YYYY/MM/DD HH24:MI:SS')  "日付文字列エラー"
            *
行2でエラーが発生しました。:
ORA-01843: 指定した月が無効です。

SQL> SELECT
  2      TO_DATE('2002/01/91 12:30:00','YYYY/MM/DD HH24:MI:SS')  "日付文字列エラー2"
  3  FROM DUAL;
    TO_DATE('2002/01/91 12:30:00','YYYY/MM/DD HH24:MI:SS')  "日付文字列エラー2"
            *
行2でエラーが発生しました。:
ORA-01847: 月単位の日付は1から月末日の間で指定する必要があります


TO_DATE 関数は「stringSrc」が NULL の場合は結果 NULL が返ります。
そのため、TO_DATE の返り値を NVL でラップしてデフォルト値を設定すると以下の様になります。

SQL> SELECT
  2      NVL(TO_DATE(NULL, 'YYYY/MM/DD HH24:MI:SS'), TO_DATE('2000/01/01'))
  3  FROM DUAL;

NVL(TO_D
--------
00-01-01