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 だとずいぶんと簡単にできました。
ディスカッション
コメント一覧
まだ、コメントがありません