CLF 日付書式を日付型に変換する【関数化・ORACLE編】

CLF 日付書式を日付型に変換する【関数化・SQL Server編】」は、SQLServerで苦心の上(?)で完成した関数ですが、同じことを Oracle で行ってみます。めちゃくちゃ簡単です。

TO_DATE 関数をNLSパラメータ指定で利用する

リファレンス(Oracle 19c)は以下にあります。

省略可能なので普通に使っているとあまり利用しませんが、第3引数に「nlsparam」が渡せます。つまり、一時的に言語設定を変更できるわけです。これを利用すれば、いとも簡単に変換できます。関連記事と同じく変換対象とする文字列は「02/Sep/2021:14:32:19」 です。

SELECT TO_DATE('02/Sep/2021:14:32:19','DD/MON/YYYY:HH24:MI:SS','NLS_DATE_LANGUAGE = English') DT FROM DUAL

SQL Developer を使って上記を実行してみます。インストール方法等は「Oracle SQL Developer を導入する【Oracle Instant Client 編】」を参考にしてください。
SQL Developer による日付表示ですが、デフォルトがいまいち(RR-MM-DD)なので「YYYY/MM/DD HH24:MI:SS」にしておきます。

日付書式の変更

以下が実行結果です。すんなりと DATE 型に変換できています。

SELECT TO_DATE('02/Sep/2021:14:32:19','DD/MON/YYYY:HH24:MI:SS','NLS_DATE_LANGUAGE = English') DT FROM DUAL
実行結果

CLF日付書式変換の関数化

それでは関数化してみます。SQL Server のように苦労しなくても良さそうです。

CREATE OR REPLACE FUNCTION TO_DATETIME(dtStr IN VARCHAR2 )
RETURN DATE
IS
BEGIN
  RETURN TO_DATE(dtStr, 'DD/MON/YYYY:HH24:MI:SS','NLS_DATE_LANGUAGE = English');
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;

日付型へ変換に失敗した場合は、NULLを返しています。関連記事と同じテストをしてみます。

WITH TEST_TABLE(DTSTR) AS (
  SELECT '01/Jan/2021:09:10:25' FROM DUAL UNION ALL
  SELECT '29/Feb/2020:19:59:29' FROM DUAL UNION ALL -- 閏年
  SELECT '01/Mar/2021:14:32:19' FROM DUAL UNION ALL
  SELECT '01/Apr/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '01/May/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '01/Jun/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '01/Jul/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '31/Aug/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '30/Sep/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '31/Oct/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '30/Nov/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '31/Dec/2021:00:00:00' FROM DUAL UNION ALL
  SELECT '29/Feb/2021:19:59:29' FROM DUAL UNION ALL -- 閏年ではない(存在しない)
  SELECT '30/XXX/2021:19:59:29' FROM DUAL           -- 月名称が変換できない
)
SELECT DTSTR,TO_DATETIME(DTSTR) RESULT FROM TEST_TABLE
テスト結果

問題なさそうですね。Oracle だとずいぶんと簡単にできました。