先日、作業中に発生した問題を共有することで少しでも皆さんが安定したリリースを迎えられますよう。。
TO_DATEによるYYYY変換の落とし穴
発生した内容でお話しするので、ピンポイントなケースになりますが、色々な場面で発生しかねないので頭の中において置いて下さい。
ORACLEのSQLのセレクト句で下記の形で2019年をキャストし、呼び出したPLSQLの引数にしました。
TO_DATE(‘2019′,’YYYY’)
そのPLSQLの中で西暦を和暦に変換するコードを書いたのですが、それがうまく判定されなかったのです。
IF {引数の’2019′(DATE型の変数)} BETWEEN TO_DATE(‘19890108′,’YYYYMMDD’) AND TO_DATE(‘20190430′,’YYYYMMDD’)
理由はテストしたい機能のためにシステム日付を変更していたこと。
不思議に思ったのは日付が「2018/10/15」だとうまく判定されるのに、「2019/04/30」だとうまく判定されなかったこと。
少々時間がかかりましたが原因がわかりました。
TO_DATEの仕様で、「MMDD」の部分を指定しなくても、内部では値をもってしまうようで、具体的には
TO_DATE(‘2019′,’YYYY’)
を「2018/10/15」のシステム日付で実行すると、TO_DATEの結果は「18-10-01」となり、
「2019/04/30」のシステム日付で実行すると、TO_DATEの結果は「19-04-01」となりました。
どうやらシステム日付の月を見て、自動的にその月の1日で補完するようです。
つまり、2018年中にテストを行った場合は問題なくても2019年に入るとおかしくなる可能性があるということ。要注意です!