年齢を計算したい

スポンサーリンク
スポンサーリンク

結論

intck関数を使う。

AGE = intck('year', BIRTHDT, REFDT, 'c');
※BIRTHDT、REFDTはSAS日付。

これだけ。


data test1;
    BIRTHDT = '2000/08/20'; REFDT = '2026/08/19'; output;
    BIRTHDT = '2000/08/20'; REFDT = '2026/08/20'; output;
    BIRTHDT = '2000/08/20'; REFDT = '2026/08/21'; output;
run;

data result1;
    set test1;
    AGE = intck('year',
                input(BIRTHDT, yymmdd10.),
                input(REFDT, yymmdd10.),
                'c');
run;

年齢計算で一番面倒なところが当年の誕生日を迎えたかどうか。
intckの第4引数に’c’を指定することでそのあたりも解釈してくれる。


2/29生まれの場合

レアケースだけど、うるう年の2/29が誕生日の場合は注意が必要。

data test2;
    BIRTHDT = '2000/02/29'; REFDT = '2024/02/27'; output;
    BIRTHDT = '2000/02/29'; REFDT = '2024/02/28'; output;
    BIRTHDT = '2000/02/29'; REFDT = '2024/02/29'; output;

    BIRTHDT = '2000/02/29'; REFDT = '2026/02/27'; output;
    BIRTHDT = '2000/02/29'; REFDT = '2026/02/28'; output;
    BIRTHDT = '2000/02/29'; REFDT = '2026/02/29'; output;
    BIRTHDT = '2000/02/29'; REFDT = '2026/03/01'; output;
run;

data result2;
    set test2;
    AGE = intck('year',
                input(BIRTHDT, yymmdd10.),
                input(REFDT, yymmdd10.),
                'c');
run;

うるう年では2/29に加算。うるう年以外では2/28に加算。
SASではこのように扱われるので2/29が誕生日の場合にはこの処理が要求を満たしているか注意が必要。

なお、2026年のような平年について2026/02/29をyymmdd10.のinformatでSAS日付値に変換しようとすると、存在しない日付として欠損値になる。


余談

ちなみに整数化であれば普通に可能。

data ex;
    x = input(compress('2026/02/29', '/'), 8.);
run;

コメント