Use the INTNX function. It's not exactly clear what you want, but maybe this will help you get started.
%macro loop;
%do i=1 %to 12;
%let date=%sysfunc(intnx(month, %sysfunc(today()), &i.), date9.);
%put &date.;
%end;
%mend;
%loop;
My best tip: write a program with no macro language, that works for a single month. Then we can worry about how to make it loop over a set of months.
My first thing involving any time, date or datetime related issue: Make sure the values are SAS time, date or datetime valued variables.
You don't say what you are going to do with multiple datasets but I bet it compounds doing more looping, macro or otherwise. Formats for the date variables can create very useable groups. Here's a very simple example. The first data step is just to create some dummy data for the proc tabulate to demonstrate creating a report with separate sections for the branch and totals by month.
data example;
length account $ 15;
do branch = 'A','B','C';
do num = 1001 to 1005;
account= cats(branch,num);
do date = '01jan2015'd to '15jul2015'd by 20;
deposit = round(1000*ranuni(456),.01);
output;
end;
end;
end;
run;
proc tabulate data=example;
class branch date;
format date monyy7.;
var deposit;
tables branch,
date='Month',
Deposit*sum*f=dollar10.2
;
run;
You can get similar results from proc means, freq, summary and report using formats on a single date varible. Also most of the modeling procedures will honor the format for creating levels of modeled variables.
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 16. 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.