Oracleで西暦から和暦に変換する方法です。データベース側で和暦を扱う時点でそのシステム自体、どうかと思いますが。
西暦から和暦に変換する
SQL的には以下の構文で西暦から和暦に変換することが出来ます。
SELECT TO_CHAR(DATE型の値,'EEYY/MM/DD','NLS_CALENDAR = ''JAPANESE IMPERIAL''') FROM DUAL;
ご覧の通り、そんなに難しくありません。DATE型の値を文字列に変更する際にTO_CHARを使用しますが、基本的には第2引数までしか使用しないと思います。知らなくてもそんなに困らないので、頭の片隅に置いておいてください。
で、和暦に変換する時、いつものTO_CHARと何が違うのかと言うと、以下に注意して下さい。第3引数は固定で大丈夫です。
- 第1引数:DATE型の値(SYSDATEでもOK)
- 第2引数:書式(和暦にした時にどう表示したいか)
- 第3引数:’NLS_CALENDAR = ”JAPANESE IMPERIAL”’ ←固定でOK
では、試しに使用してみます。冒頭で紹介した構文で実行してみます。日付はノストラダムスの大予言である1999年7月で、これを和暦に変換すると平成11年になるはずです。
SELECT TO_CHAR(TO_DATE('19990701','YYYY/MM/DD'),'EEYY/MM/DD','NLS_CALENDAR = ''JAPANESE IMPERIAL''') FROM DUAL;
TO_CHARの中にTO_DATEというちょっと変なことをしていますが、余り気にしないでください。先述した通り、第1引数がDATE型なら、何もしなくても良いです。これを実行してみます。
一応和暦が出てきましたね。ただ、「平成11/07/01」と少し残念ですので、TO_CHARの第2引数を変更します。
SELECT TO_CHAR(TO_DATE('19990701','YYYY/MM/DD'),'EEYY"年"MM"月"DD"日"','NLS_CALENDAR = ''JAPANESE IMPERIAL''') FROM DUAL;
TO_CHARの第2引数を「’EEYY/MM/DD’」から「’EEYY”年”MM”月”DD”日”‘」に変更しています。「年」「月」「日」を「”」(ダブルクォーテーション)で囲っています。それでは実行します。
「平成11年07月01日」と表示されました。これで日本でもノストラダムスの大予言が的中して滅亡できますね。ただ、政治家が日本を食い物にしているので大魔王がやって来る前に日本が滅亡してしまうかもしれません。
ちなみに、次の記述でも同じことが出来ます。
SELECT TO_CHAR(TO_DATE('19990701','YYYY/MM/DD'),'EEYY','NLS_CALENDAR = ''JAPANESE IMPERIAL''') || '年' || TO_CHAR(TO_DATE('19990701','YYYY/MM/DD'),'MM') || '月' || TO_CHAR(TO_DATE('19990701','YYYY/MM/DD'),'DD') || '日' FROM DUAL;
どちらにするかはお好みで。一発で書ける「’EEYY”年”MM”月”DD”日”‘」の方が良いかもしれませんが、書式モデルを分解して理解したい場合はパイプラインで結合した方法でするものありかもしれません。
なお、時分秒まで出したい場合は次の様にします。
SELECT TO_CHAR(TO_DATE('19990701123456','YYYYMMDDHH24MISS') ,'EEYY"年"MM"月"DD"日"HH24"時"MI"分"SS"秒"' ,'NLS_CALENDAR = ''JAPANESE IMPERIAL''') FROM DUAL;
まあこのレベルまでこだわると時間がかかるので、理解出来なかったら遠慮なくコピペして実行して下さい。ちょちょいとカスタマイズすればお望みの値が取得できるかも。
関連記事
.