It's with SAS data steps and especially SAS proc's often easier to work with narrow data structures. That's what below code creates.
data have;
infile datalines dsd truncover;
input member (start1 end1 start2 end2) (:date11.) /*days2019 days2020 days2021 days2022 days2023*/ ;
format start1 end1 start2 end2 date11.;
datalines;
123,1-Mar-20,1-Apr-20,1-Feb-22,30-Jun-23,0,31,0,333,180
456,1-Jan-19,1-Jan-20,,,365,1,0,0,0
789,13-Apr-23,15-Apr-23,,,0,0,0,0,3
;
data want;
set have;
array dates{2,2} start1 end1 start2 end2;
format start_dt end_dt from_dt to_dt date11.;
do k=1 to dim1(dates);
if nmiss(dates[k,1],dates[k,2]) then continue;
start_dt =dates[k,1];
end_dt =dates[k,2];
from_dt=start_dt;
do i=0 by 1;
to_dt=min(intnx('year',start_dt,i+1,'b'),end_dt);
year=year(from_dt);
days=to_dt-from_dt;
output;
if to_dt=end_dt then leave;
from_dt=intnx('year',start_dt,i+1,'b');
end;
end;
drop start1 end1 start2 end2 k i;
run;
proc print data=want;
run;
... View more