- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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");
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
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