結論
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;


コメント