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.
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.