Hello,
I am trying to execute the below code but the execution stops unexpectedly. For reference, the min_date is 15Feb1993 and the max_date is 15Dec2013. At the bottom of the macro I have also pasted macro variable resolution from the log. Any help is greatly appreciated. Thanks
%macro run_all;
proc sql noprint;
select max(datepart(current_date)) format=date9., min(datepart(current_date)) format=date9.
into :max_date, :min_date
from edf;
quit;
%do %until ("&min_date."d ge "&max_date."d);
%let var_2= %sysfunc(inputn(&min_date,date9.),monyy5.);
%cohort(&min_date,&var_2);
%let min_date=%sysfunc(intnx(month,"&min_date."d,3,same),date9.);
%put &min_date.;
%end;
%mend run_all;
SYMBOLGEN: Macro variable MIN_DATE resolves to 15FEB1993
MLOGIC(RUN_ALL): %PUT &min_date.
SYMBOLGEN: Macro variable MIN_DATE resolves to 15MAY1993
15MAY1993
SYMBOLGEN: Macro variable MIN_DATE resolves to 15MAY1993
SYMBOLGEN: Macro variable MAX_DATE resolves to 15DEC2013
MLOGIC(RUN_ALL): %DO %UNTIL() condition is TRUE; loop will not iterate again.
Hello @sai_ch,
To fix the issue pointed out by Astounding, simply apply %SYSEVALF to the %UNTIL condition:
%do %until(%sysevalf("&min_date."d ge "&max_date."d));
The %SYSEVALF function helps the macro processor to understand SAS dates (and more).
Macro language does not understand SAS dates. It thinks that %DO %UNTIl is comparing two character strings. So the first time through the loop, the %UNTIL condition is true and the loop ends. because "15M is greater than "15D.
Lucky for you that it stopped. With a few changes to the dates, you might have constructed an infinite loop.
Hello @sai_ch,
To fix the issue pointed out by Astounding, simply apply %SYSEVALF to the %UNTIL condition:
%do %until(%sysevalf("&min_date."d ge "&max_date."d));
The %SYSEVALF function helps the macro processor to understand SAS dates (and more).
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.