Hi,
How do I add 45days from from a year ago to today's date?
this is what i have so far in my program but it is only adding 45days for 08OCT2019 (period 2).
I need to create period 3, period 4, period 5, etc. until present day. Thank you
data x;
period1dt='08OCT2019'd;
day45=intnx('day',period1dt,45);
run;
Do you mean efficient or do you mean flexible?
If you want to make it so there is little hard coding and the program is very flexible, you could use macros like the below example. Here, even the variable names in the output SAS dataset are dynamically determined based on the values of the macro variables set at the top of the program.
Results from the below program:
Jim
%LET Period_Start = '08OCT2019'd;
%LET Period_End = %QSYSFUNC(INTNX(DAY,&Period_Start, 365));
%LET Increment = 45;
%MACRO Calculate_Periods;
%DO i = 1 %TO 999;
%GLOBAL Day45_&i;
%GLOBAL Nbr_Increments;
%IF %SYSFUNC(INTNX(DAY,&Period_Start, %EVAL(&Increment * &i))) > &Period_End %THEN
%DO;
%LET Nbr_Increments = %EVAL(&i - 1);
%LET i = 999;
%END;
%ELSE
%DO;
%LET Day&Increment._&i = %SYSFUNC(INTNX(DAY,&Period_Start, %EVAL(&Increment * &i)));
%END;
%END;
%MEND Calculate_Periods;
%Calculate_Periods;
*%PUT _USER_;
%MACRO Generate_SAS_Code;
%DO i = 1 %TO &Nbr_Increments;
Day&Increment._&i = &&Day&Increment._&i;
%END;
%MEND Generate_SAS_Code;
data x;
FORMAT Period_Start Day&Increment._1 - Day&Increment._&Nbr_Increments Period_End YYMMDDD10.;
Period_Start = &Period_Start;
Period_End = &Period_End;
%Generate_SAS_Code;
run;
If it's it's a set period you need the 45 day incrdments for, you could do something like:
data x;
period1dt='08OCT2019'd;
day45_1=intnx('day',period1dt,45);
day45_2=intnx('day',day45_1,45);
day45_3=intnx('day',day45_2,45);
day45_4=intnx('day',day45_3,45);
day45_5=intnx('day',day45_4,45);
day45_6=intnx('day',day45_5,45);
day45_7=intnx('day',day45_6,45);
day45_8=intnx('day',day45_7,45);
run;
Jim
Results from the above (with formats added for clarity):
Jim
And if you want it as rows and a little less hardcoded.
data x;
format period1dt date10.;
period1dt='08OCT2019'd;
do until(period1dt > date());
output;
period1dt = intnx('day',period1dt,45);
end;
run;
@HitmonTran wrote:
is there a way to make the program more efficient?
Define efficient.
An array and loop counter for the number of times you want to add 45 days would be one way.
But since 45 does not go evenly into a year, 8.11111 (repeats) when the year is 365 days or 8.13333 (repeats) when 366 days, then your definition for "intervals for 1 year" needs some expansion.
Perhaps you are looking for something like this:
data have;
startdt='08OCT2019'd; output;
startdt='08DEC2019'd; output;
startdt='08DEC2017'd; output;
run;
data x;
set have;
array period [1:100] ;
i = 1;
period1dt = startdt;
do until(period1dt > date() or i > 100);
period(i) = period1dt;
period1dt = intnx('day',period1dt,45);
i = i + 1;
end;
run;
Do you mean efficient or do you mean flexible?
If you want to make it so there is little hard coding and the program is very flexible, you could use macros like the below example. Here, even the variable names in the output SAS dataset are dynamically determined based on the values of the macro variables set at the top of the program.
Results from the below program:
Jim
%LET Period_Start = '08OCT2019'd;
%LET Period_End = %QSYSFUNC(INTNX(DAY,&Period_Start, 365));
%LET Increment = 45;
%MACRO Calculate_Periods;
%DO i = 1 %TO 999;
%GLOBAL Day45_&i;
%GLOBAL Nbr_Increments;
%IF %SYSFUNC(INTNX(DAY,&Period_Start, %EVAL(&Increment * &i))) > &Period_End %THEN
%DO;
%LET Nbr_Increments = %EVAL(&i - 1);
%LET i = 999;
%END;
%ELSE
%DO;
%LET Day&Increment._&i = %SYSFUNC(INTNX(DAY,&Period_Start, %EVAL(&Increment * &i)));
%END;
%END;
%MEND Calculate_Periods;
%Calculate_Periods;
*%PUT _USER_;
%MACRO Generate_SAS_Code;
%DO i = 1 %TO &Nbr_Increments;
Day&Increment._&i = &&Day&Increment._&i;
%END;
%MEND Generate_SAS_Code;
data x;
FORMAT Period_Start Day&Increment._1 - Day&Increment._&Nbr_Increments Period_End YYMMDDD10.;
Period_Start = &Period_Start;
Period_End = &Period_End;
%Generate_SAS_Code;
run;
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.