One solution is to create a macro that generates the list on the fly:
%macro date_list(startdate,enddate,informat=ddmmyy10.,format=ddmmyy10.,increment=year,delim=%str(,));
%local start end diff i;
%let start=%sysfunc(inputn(&startdate,&informat));
%let end=%sysfunc(inputn(&enddate,&informat));
%let diff=%sysfunc(intck(&increment,&start,&end));
%do;%sysfunc(putn(&start,&format))%end;
%do i=1 %to &diff;&delim%sysfunc(intnx(year,&start,&i,b),&format)%end;
%mend;
%put %date_list(01-01-2017,01-01-2021);
I made the macro a bit more flexible by adding some parameters (with defaults):
INFORMAT is the informat used to read STARTDATE and ENDDATE.
FORMAT is the format used on the output, if you use e.g. 5.0, you will get a list of raw SAS dates, which can be used in an IN clause.
INCREMENT is the increment used in INTNX, so that the macro can also be used to generate e.g. a list of monthly dates.
DELIM is the output delimiter.
... View more