Quartz | Level 8

## need to calculate age for people born before 1960

I tried to calculate age using the

current_age=int(yrdif(b_date, today(), 'ACTUAL')); Since the age is before 1960 for bene_id 02, It is giving me negative value.

Here is my data after calculating age:

bene_id    b_date           Current_age

01             18May64        54

02             18Jun22         -3

03              08sep51        67

Any help appreciated!

1 ACCEPTED SOLUTION

Accepted Solutions
Super User

## Re: need to calculate age for people born before 1960

The YEARCUTOFF option only impacts how SAS determine the century when converting text with two digit years into dates.

You are not converting any text into dates.  You already have data with the wrong century.

You might add logic to check the date for reasonableness before calculating age.

``````data B;
set A;
b_date=datepart(birthdate);
date=today();
if b_date > date then do;
put b_date = @ ;
b_date=intnx('year',b_date,-100,'s');
put '-> ' b_date ;
end;
current_age=int(yrdif(b_date, date, 'ACTUAL'));
format b_date date date9.;
run;``````
23 REPLIES 23
Tourmaline | Level 20

## Re: need to calculate age for people born before 1960

Try:

Age_exact = floor((intck('month',DOB,Date)-(day(Date) < day(DOB))) / 12);

plug in: today() for date

Quartz | Level 8

## Re: need to calculate age for people born before 1960

I used it as:

age_exact=floor((intck('month', b_date, Date)-(day(Date) < day(b_date)))/12);

and I saw both two new variables were empty.

Tourmaline | Level 20

## Re: need to calculate age for people born before 1960

Ok tested with your sample that you gave us. Here it is:

``````options yearcutoff=1910;
data have;
input bene_id \$   b_date  :date9.;
format b_date date9.;
cards;
01             18May64
02             18Jun22
03              08sep51
;

data want;
set have;
date=today();
Age_exact = floor((intck('month',b_date,Date)-(day(Date) < day(b_date))) / 12);format date date9.;
run;``````
Quartz | Level 8

## Re: need to calculate age for people born before 1960

Thanks, but I'm still getting -4 as a value for age_exact.

Tourmaline | Level 20

## Re: need to calculate age for people born before 1960

Please run the code i gave you. Here is the result. Just run and see:

proc print data=want noobs;run;

SAS Output

 The SAS System

bene_id b_date date Age_exact
01 18MAY1964 12SEP2018 54
02 18JUN1922 12SEP2018 96
03 08SEP1951 12SEP2018 67
Quartz | Level 8

## Re: need to calculate age for people born before 1960

I had created the b_date variable from the date variable birthdate(with datetime. format) using following code:

birthdate=datepart(b_date);
format birthdatef date.;

My data now looks like this after applying the code you suggested.

 bene_id birthdate b_date date Age 1 18May64:00:06:08 18-May-64 12-Sep-18 54 2 18Jun22:00:09:03 18-Jun-22 12-Sep-18 -4 3 8Sep51:00:01:06 8-Sep-51 12-Sep-18 67
Super User

## Re: need to calculate age for people born before 1960

What happens when you use a DATE9 format. I suspect you have a data integrity issue.

Super User

## Re: need to calculate age for people born before 1960

Your problem is not that the birth date is before 1960.  The problem is that the birth date is after 2018.

Displaying the dates with only two digits of the year is confusing you, but not SAS.

```                               Current_    current_
Obs    bene_id       b_date      age_x        age

1        1       18MAY1964        54          54
2        2       18JUN1922        -3          96
3        2       18JUN2022        -3          -3
4        3       08SEP1951        67          67```
Quartz | Level 8

## Re: need to calculate age for people born before 1960

It's not because it is before 1960. It is because it is before 1926, which is the default yearcutoff= when using date7. formats. Change the yearcutoff= option to 1910 and it works.
Quartz | Level 8

## Re: need to calculate age for people born before 1960

thanks, any suggestion on how to handle the negative age?

Super User

## Re: need to calculate age for people born before 1960

I tried to calculate age using the

current_age=int(yrdif(b_date, today(), 'ACTUAL')); Since the age is before 1960 for bene_id 02, It is giving me negative value.

Here is my data after calculating age:

bene_id    b_date           Current_age

01             18May64        54

02             18Jun22         -3

03              08sep51        67

Any help appreciated!

The most likely issue is that your dates had 2-digit years and when you read them the YEARCUTOFF option assumed the dates you thought were 19xx were actually 20xx.

Run this code:

```proc options option=yearcutoff;
run;```

Check the log for the value displayed. Example from mine:

``` YEARCUTOFF=1926   Specifies the first year of a 100-year span that is used by date informats and
functions to read a two-digit year.

```

Any year prior to 26 will be treated as 20XX.

Fix: either use 4 digit years or adjust the year cutoff value with

options yearcutoff=1920; (or similar).

Caution: if you use 1918 then any births in 2018 are in danger.

Then reread the data with the two digit years and then reset your yearcutoff option.

The above is one way.

Or you could test the year of b_date and adjust the birth date:

if year(b_date) > year(today()) then b_date=intnx('year',b_date,-100);

BEFORE calculating the age.

Ammonite | Level 13

## Re: need to calculate age for people born before 1960

your negative value is because the second card has jun-18-2022 as the birthdate if you don't set the options yearcutoff=1910;

Quartz | Level 8

## Re: need to calculate age for people born before 1960

Here is my result from

proc options option=yearcutoff;
run;

SAS (r) Proprietary Software Release 9.4 TS1M5

YEARCUTOFF=1910 Specifies the first year of a 100-year span that is used by date informats and functions to read a two-digit
year.

Ammonite | Level 13

## Re: need to calculate age for people born before 1960

is the 22 year 1922 or 2022.  If 1922 then the options yearcutoff=1910, works correctly.  If the person was born in 2022 then you have to wait until they are born to calculate their age.

Discussion stats
• 23 replies
• 2142 views
• 8 likes
• 9 in conversation