SQL
oracle
和暦
西暦

Age Chart 年齢早見表 for Oracle

age_chart.sql
--
-- Oracle12.1.0  グローバリゼーション・サポート・ガイド
-- https://docs.oracle.com/cd/E57425_01/121/NLSPG/ch13custlocale.htm#BABIBFBA
-- 12 ロケール・データのカスタマイズ
--      NLSカレンダ・ユーティリティを使用したカレンダのカスタマイズ
--
--        > NLSカレンダ・ユーティリティ(lxegen) で新しい元号を登録できる。
--          実行したことないけど。
--
-- 和暦は使ってはならない。明日元号が変わるかもしれない。
--
COLUMN SEIREKI  FORMAT A4  HEADING "西暦"
COLUMN WAREKI   FORMAT A29 HEADING "和暦"
COLUMN AGE      FORMAT 990 HEADING "年齢"
-- SPOOLのパスに SYSDATEのYYYYを含める
COLUMN SYSTEM_YEAR  NEW_VALUE SYSTEM_YEAR
SELECT TO_CHAR(SYSDATE, 'YYYY') AS SYSTEM_YEAR
FROM DUAL ;
SPOOL age_chart_&&SYSTEM_YEAR..txt
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL age_chart_\&&SYSTEM_YEAR..txt
SELECT
    TO_CHAR(B.YEARS, 'FM0000') AS SEIREKI
  , CASE
        WHEN B.YEARS = 1868 THEN
            '明治 01/09/08~'
        WHEN B.YEARS = 1912 THEN
            '明治 45/07/29 | 大正 01/07/30'
        WHEN B.YEARS = 1926 THEN
            '大正 15/12/24 | 昭和 01/12/25'
        WHEN B.YEARS = 1989 THEN
            '昭和 64/01/07 | 平成 01/01/08'
        ELSE
            TO_CHAR(TO_DATE(TO_CHAR(B.YEARS, 'FM0000'), 'YYYY'), 'EE YY', 'NLS_CALENDAR = ''Japanese Imperial''')
    END AS WAREKI
  , B.YEAR_TO - B.YEARS AS AGE
FROM(
    -- NUMBER FROM ~ TO
    SELECT
        A.YEAR_FROM + ROWNUM - 1 AS YEARS
      , A.YEAR_TO
    FROM(
        SELECT
            1868 AS YEAR_FROM                               -- Meiji First year
          , TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) AS YEAR_TO  -- this year
        FROM DUAL
        ) A
    CONNECT BY LEVEL <= A.YEAR_TO - A.YEAR_FROM + 1  -- Hierarchical Querie
    ) B ;
SPOOL OFF

参考
Oracle SQL 連番や連続した日付を取得
Oracle Database の NLSカレンダ・ユーティリティで新しい元号(年号)を追加