-- うるう日生まれに対応-- 年齢計算に関する法律を考慮した場合において、BASEDATE が大晦日のときの問題に対応-- P_METHOD: 0:一般的な年齢/1:年齢計算に関する法律を考慮/2:数え年
CREATE OR REPLACE FUNCTION RIVUS.YEARS_OF_AGE(
P_BIRTHDAY IN DATE,
P_BASEDATE IN DATE := SYSDATE,
P_METHOD IN NUMBER := 0 )
RETURN NATURAL
IS
vBaseDate DATE := P_BASEDATE;
vYearsOffset PLS_INTEGER := 0;
vYears PLS_INTEGER;
BEGIN
IF (P_METHOD = 1) THEN
vBaseDate := vBaseDate + 1;
END IF;
vYears := EXTRACT(YEAR FROM vBaseDate) - EXTRACT(YEAR FROM P_BIRTHDAY);
IF (P_METHOD = 2) THEN
vYearsOffset := 1;
ELSIF (TO_CHAR(vBaseDate, 'MMDD') < TO_CHAR(P_BIRTHDAY, 'MMDD')) THEN
vYearsOffset := -1;
END IF;
RETURN vYears + vYearsOffset;
END;
/
-- 一般的な年齢についての SQL 変換例-- 少々長くなるが以下のようになるSELECTEXTRACT(YEAR FROM P_BASEDATE) - EXTRACT(YEAR FROM P_BIRTHDAY) -
CASE WHEN TO_CHAR(P_BASEDATE, 'MMDD') < TO_CHAR( P_BIRTHDAY, 'MMDD') THEN
1 ELSE 0 END
FROM DUAL ;