PL/SQL 西暦和暦変換 for Oracle10g

YYYYMMDD形式の日付をWYY.MM.DDに変換する関数。とりあえず書いたので貼っとく。CASE文はOracle9i以降対応らしいので注意。

ソース

CREATE OR REPLACE FUNCTION yyyy_to_wyy
(
  pDate IN NUMBER
)
RETURN VARCHAR2
IS
  cYear VARCHAR2(4);
  cMonth VARCHAR2(2);
  cDay VARCHAR2(2);
BEGIN
  cYear := SUBSTR(TO_CHAR(pDate),1,4);
  cMonth := SUBSTR(TO_CHAR(pDate),5,2);
  cDay := SUBSTR(TO_CHAR(pDate),7,2);

  CASE 
    WHEN pDate - 19890107 > 0 THEN
      RETURN 'H' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1989) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19261224 > 0 THEN
      RETURN 'S' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1926) || '.' || cMonth || '.' || cDay;
    WHEN pDate - 19120729 > 0 THEN
      RETURN 'T' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1912) || '.' || cMonth || '.' || cDay;
    ELSE
      RETURN 'M' || TO_CHAR(TO_NUMBER(cYear) + 1 - 1868) || '.' || cMonth || '.' || cDay;
  END CASE;
END;

使い方

SELECT YYYY_TO_WYY(20070829) FROM DUAL
→"H19.8.29"