Hello:
I have a code below to compute the age. I am trying to figure out what this codes are for.
%macro age(date,birth);
floor ((intck('month',&birth,&date)- (day(&date) < day(&birth))) / 12) ;
%mend age;
Age_calc = %age(screendate, DOB);
age = round(Age_calc);
Or better codes to do this?
Depends somewhat on how you want the age but the typical use of age can be
age = floor ( yrdif (DOB, comparedate, 'AGE'));
if you want an integer age. Without the the FLOOR function to round down you get a decimal value.
The current macro, which has been around a long time it is calculating the months between two dates with the INTCK function and then if the day of the month is before the day of month of birth subtracting one month, then divides that by 12 to get approximate year and truncates that result to remove the decimal portion by rounding down.
No reason to define a macro anymore, you might as well call the INTCK function. The way to calculate the exact age with function INTCK is
intck("YEAR", birth, date, "CONTINUOUS");
Note that the three methods suggested yield different results if DOB was a February 29 and DATE is a February 28:
data _null_;
dob='29FEB2000'd;
do date='28FEB2004'd, '28FEB2005'd;
agemc=%age(date, dob);
ageyd=floor(yrdif(dob, date, 'age'));
ageic=intck('year', dob, date, 'c');
put (d:)(=date9.) (a:)(=);
end;
run;
dob=29FEB2000 date=28FEB2004 agemc=3 ageyd=4 ageic=3 dob=29FEB2000 date=28FEB2005 agemc=4 ageyd=5 ageic=5
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.