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).
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
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.