BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Sathish_jammy
Lapis Lazuli | Level 10

Dear Experts,

 

I have to calculate the date duration in the below-given format.

Let me share the sample dataset for a clear view.

 

data have;
input Id r_date :mmddyy10. e_date :mmddyy10.;
format r_date e_date mmddyy10.;
cards;
101 05/18/2001 09/25/2002
101 09/26/2002 12/12/2003
101 12/13/2003 05/04/2004
108 06/06/1995 08/12/1996
108 08/11/1996 07/10/1999
run;

For this data set, I need to process the date duration in the given method.

Expected output.

sas dbt.jpg

 

Note : The value of Start_dur in each minimum R_date of IDs is always 0

           Each E_dur will calculate the duration of the minimum R_date of corresponding IDs.

 

Please suggest some ideas to solve the task.

Thanks in Advance!

 

1 ACCEPTED SOLUTION

Accepted Solutions
PeterClemmensen
Tourmaline | Level 20

I'm not sure, I get this completely, though here's a shot. I don't understand why End_Dur should be three in the last obs in the ID=101 group though?

 

data want;
    if 0 then set have;
    Start_Dur=0;
    do until (last.id);
        set have;
        by id;
        End_Dur=Start_Dur+round(intck('day', r_date, e_date)/365.25, .1);
        output;
        Start_Dur=End_Dur;
    end;
run;

Result:

 

Id      r_date          e_date       Start_Dur End_Dur
101 05/18/2001 09/25/2002 0 1.4 101 09/26/2002 12/12/2003 1.4 2.6 101 12/13/2003 05/04/2004 2.6 3 108 06/06/1995 08/12/1996 0 1.2 108 08/11/1996 07/10/1999 1.2 4.1

View solution in original post

6 REPLIES 6
PeterClemmensen
Tourmaline | Level 20

I'm not sure, I get this completely, though here's a shot. I don't understand why End_Dur should be three in the last obs in the ID=101 group though?

 

data want;
    if 0 then set have;
    Start_Dur=0;
    do until (last.id);
        set have;
        by id;
        End_Dur=Start_Dur+round(intck('day', r_date, e_date)/365.25, .1);
        output;
        Start_Dur=End_Dur;
    end;
run;

Result:

 

Id      r_date          e_date       Start_Dur End_Dur
101 05/18/2001 09/25/2002 0 1.4 101 09/26/2002 12/12/2003 1.4 2.6 101 12/13/2003 05/04/2004 2.6 3 108 06/06/1995 08/12/1996 0 1.2 108 08/11/1996 07/10/1999 1.2 4.1
andreas_lds
Jade | Level 19

Maybe i need more coffee to understand this, but please explain how to calculate the values of End_Dur. 

Kurt_Bremser
Super User

@andreas_lds wrote:

Maybe i need more coffee to understand this, but please explain how to calculate the values of End_Dur. 


The decimals are the number of months, so you get a meaningless result when stored as a number (because 0.10 is the same as 0.1).

Kurt_Bremser
Super User

It takes a little trickery to build the number, but here we go:

data have;
input Id r_date :mmddyy10. e_date :mmddyy10.;
format r_date e_date yymmddd10.;
cards;
101 05/18/2001 09/25/2002
101 09/26/2002 12/12/2003
101 12/13/2003 05/04/2004
108 06/06/1995 08/12/1996
108 08/11/1996 07/10/1999
run;

data want;
set have;
by id;
retain start_dur end_dur start_date;
format start_dur end_dur best5.;
if first.id
then do;
  start_dur = 0;
  start_date = r_date;
end;
else do;
  start_dur = end_dur;
end;
dur = intck('month',start_date,e_date,'c');
end_dur = input(catx('.',put(int(dur/12),3.),put(mod(dur,12),2.)),5.);
drop start_date dur;
run;

proc print data=want noobs;
run;

Result:

                                   start_
 Id        r_date        e_date     dur      end_dur

101    2001-05-18    2002-09-25        0        1.4 
101    2002-09-26    2003-12-12      1.4        2.6 
101    2003-12-13    2004-05-04      2.6       2.11 
108    1995-06-06    1996-08-12        0        1.2 
108    1996-08-11    1999-07-10      1.2        4.1 

Mind that such a number isn't much good for further use, as 2.11 is smaller than 2.2.

Ksharp
Super User
data have;
input Id r_date :mmddyy10. e_date :mmddyy10.;
dif=round(yrdif(r_date,e_date,'age'),.1);
format r_date e_date yymmddd10.;
cards;
101 05/18/2001 09/25/2002
101 09/26/2002 12/12/2003
101 12/13/2003 05/04/2004
108 06/06/1995 08/12/1996
108 08/11/1996 07/10/1999
;
run;
data want;
 set have;
 by id;
 if first.id then end_dur=0;
 end_dur+dif;
 start_dur=lag(end_dur);
 if first.id then start_dur=0;
run;

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1530 views
  • 1 like
  • 5 in conversation