1) You are not using macro but macrovariables
2) If your MONTH variable contains proper date it works:
data DPDTest;
Account_ID=0;
FINREP_CURR_SEGMENT =2;
FINREP_CURR_SEGMENT_REASON=3;
DPD=666;
DRAWN_EXPOSURE=5;
do MONTH = "15apr2023"d to '31dec2023'd by 5;
Account_ID+1;
output;
end;
run;
%let HIST_DATE_START = 01NOV2023;
%let HIST_DATE_END = %sysfunc(intnx(month,"&HIST_DATE_START."d,-3,end),Date9.);
%put &=HIST_DATE_START.;
%put &=HIST_DATE_END.;
Proc sql;
create table Checks as
select Account_ID,
FINREP_CURR_SEGMENT,
FINREP_CURR_SEGMENT_REASON,
DPD,
DRAWN_EXPOSURE,
MONTH
from DPDTest
where month between "&HIST_DATE_START."d and "&HIST_DATE_END."d
and DPD > 30;
QUIT;
Log:
1 data DPDTest;
2 Account_ID=0;
3 FINREP_CURR_SEGMENT =2;
4 FINREP_CURR_SEGMENT_REASON=3;
5 DPD=666;
6 DRAWN_EXPOSURE=5;
7 do MONTH = "15apr2023"d to '31dec2023'd by 5;
8 Account_ID+1;
9 output;
10 end;
11 run;
NOTE: The data set WORK.DPDTEST has 53 observations and 6 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
12
13 %let HIST_DATE_START = 01NOV2023;
14 %let HIST_DATE_END = %sysfunc(intnx(month,"&HIST_DATE_START."d,-3,end),Date9.);
15 %put &=HIST_DATE_START.;
HIST_DATE_START=01NOV2023
16 %put &=HIST_DATE_END.;
HIST_DATE_END=31AUG2023
17
18 Proc sql;
19 create table Checks as
20 select Account_ID,
21 FINREP_CURR_SEGMENT,
22 FINREP_CURR_SEGMENT_REASON,
23 DPD,
24 DRAWN_EXPOSURE,
25 MONTH
26 from DPDTest
27 where month between "&HIST_DATE_START."d and "&HIST_DATE_END."d
28 and DPD > 30;
NOTE: Table WORK.CHECKS created, with 13 rows and 6 columns.
29 QUIT;
NOTE: PROCEDURE SQL used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
3) Since your month is in YYYYMM form (as a number, e.g.,202306) do it like:
%let HIST_DATE_START = 01NOV2023;
%let MONTH_ST= %sysfunc(int("&HIST_DATE_START."d),yymmn6.);
%let MONTH_ED= %sysfunc(intnx(month,"&HIST_DATE_START."d,-3,end),yymmn6.);
%put &=MONTH_ST.;
%put &=MONTH_ED.;
Proc sql;
create table Checks as
select Account_ID,
FINREP_CURR_SEGMENT,
FINREP_CURR_SEGMENT_REASON,
DPD,
DRAWN_EXPOSURE,
MONTH
from DPDTest
where month between &MONTH_ST. and &MONTH_ED.
and DPD > 30;
QUIT;
Bart