BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
Santt0sh
Lapis Lazuli | Level 10

 

Please find the below code and help get the datasets for every 3 months. i have tried many things but i am not able to stop at the third month(i.e. the begin and end date the macro variable to should capture the 3rd month
but im creating a new value for every i. i have tried Max (&I.)).
In "MY CODE" below i am not able to iterate (i++) when the its the 4th month.
for ex : Jan Feb and Mar months. im trying to end the procesing at mar and start or pick a new month from april, may or june.
the below Original Code we are only extracting for every 3 months but now i am trying to get for every 3rd month in a year.(q1,q2,q3,and q4).

Kindly Suggest!!!!
/*ORIGINAL CODE*/ DATA _NULL_; TDY = MDY(MONTH(TODAY()),1,YEAR(TODAY())); ENDATE = TDY - 1; STDATE = MDY(MONTH(ENDATE),1,YEAR(ENDATE)); /*CREATE CURRENT START DATE AND END DATE OF THE MONTHS 1ST & LAST DAY OF THE MONTH*/ CALL SYMPUTX('MNSTRT',PUT(STDATE ,YYMMDD10.)); CALL SYMPUTX('MNENDT',PUT(ENDATE,YYMMDD10.)); CALL SYMPUTX('DATE1',PUT(STDATE,YYMMN6.)); /*PRIOR MONTHS -1 MONTH*/ CURR_DTE_2 = INTNX('MONTH',STDATE,-1,'S'); CALL SYMPUTX ('DATE2',PUT(CURR_DTE_2 ,YYMMN6.)); CALL SYMPUTX ('TXNDATE1',PUT(CURR_DTE_2 ,YYMMN6.)); /*PRIOR MONTHS -2 MONTH*/ CURR_DTE_3 = INTNX('MONTH',STDATE,-2,'S'); CALL SYMPUTX ('DATE3',PUT(CURR_DTE_3 ,YYMMN6.)); CALL SYMPUTX ('TXNDATE2',PUT(CURR_DTE_3 ,YYMMN6.)); CALL SYMPUTX ('QTRNDATE',PUT(CURR_DTE_3 ,YYMMDD10.)); /*THIS WILL END FOR THE QTR*/ /*3 MONTHS PRIOR*/ CURR_DTE_4 = INTNX('MONTH',STDATE,-3,'S'); CALL SYMPUTX ('TXNDATE3',PUT(CURR_DTE_4 ,YYMMN6.)); /*TO CREATE THE NUMBER OF DAYS(SAS DAYS)*/ CALL SYMPUTX('BGDTE',CURR_DTE_3); CALL SYMPUTX('endt',ENDATE); PUT CURR_DTE_4 = YYMMDD10. CURR_DTE_3 = YYMMDD10. CURR_DTE_2 = YYMMDD10. STDATE=YYMMDD10. ENDATE = YYMMDD10.; RUN; %put date1====>> &date1. date2====>> &date2. date3====>> &date3.; %put TXNDATE1====>> &TXNDATE1. TXNDATE2====>> &TXNDATE2. TXNDATE3====>> &TXNDATE3.; /*atmdates*/ %PUT BGNDTE ==>> &BGDTE. ; %PUT endDTE ==>> &endt.; /*-----------------------------------------------------------------------------------*/ /*programmatically obtain dates*/ /*MY CODE*/ /*INITIALLY I WAS PLANNING TO GET ALL THE MONTHS FOR AN YEAR AND BREAK THEM INTO QTRS, BUT I FAILED TO. SO USED THE ORIGINAL CODE ABOVE */ DATA _NULL_; YR_START_DATE=INTNX('MONTH', DATE(), -1, 'B'); YR_END_DATE=INTNX('MONTH', DATE(), -12, 'E'); DO UNTIL(YR_END_DATE>YR_START_DATE); i+1; MNTH_START_DATE=YR_START_DATE; MNTH_END_DATE=INTNX('MONTH', MNTH_START_DATE, 0, 'S'); PREVDTE=INTNX('MONTH', MNTH_START_DATE, -1, 'S'); /*PREVIOUS MONTHS DATE*/ PUT MNTH_START_DATE=YYMMDD10. MNTH_END_DATE=YYMMDD10. PREVDTE=YYMMDD10.; CALL SYMPUT(CATS('MNTH', I), PUT(MNTH_START_DATE, YYMMN6.)); CALL SYMPUT(CATS('MNTHSTDT', I), PUT(MNTH_START_DATE, YYMMN6.)); CALL SYMPUT(CATS('MNTHENDDT', I), PUT(MNTH_END_DATE, YYMMN6.)); CALL SYMPUT(CATS('DATE', I), PUT(MNTH_END_DATE, YYMMN6.)); /*FIRST MONTHS DATE YYMM AS TRANSACTION DATE*/ CALL SYMPUT(CATS('ATMDATE', I), PUT(PREVDTE, YYMMN6.)); /*PREVIOUS MONTHS DATE YYMM AS TRANSACTION DATE*/ CALL SYMPUT(CATS('PREVDTE', I), PUT(INTNX('MONTH', MNTH_START_DATE, -1, 'S'), YYMMDD10.)); /*PREVIOUS MONTHS DATE YYMMDD AS TRANSACTION DATE*/ YR_START_DATE=INTNX('MONTH', YR_START_DATE, -1); END; PUT YR_START_DATE YR_END_DATE; RUN; /* I AM TRYING TO ARRANGE THE DATASETS FOR EVERY QUARTER WHICH CAN BE HELPFUL FOR ANALYSIS AND SPACE */ %MACRO QTRS(); %DO i=1 %TO 3;/*TRYING FOR THE 1ST QTR*/ %LET K = %EVAL(&i.+1); /* TO GET THE PREVIOUS DATES FOR THE PREVIOUS MONTHS */ %LET CURR_DATE_&K. = &&PREVDTE&i.; %PUT &&CURR_DATE_&K.; %LET ATMDATE&i. = %SYSFUNC(INPUTN(&&CURR_DATE_&K., YYMMDD10.), YYMMN6.); %PUT ATM&i.===>> &&ATMDATE&i.; %LET DATE_&K. = %SYSFUNC(INPUTN(&&CURR_DATE_&K., YYMMDD10.), YYMMN6.); %PUT DATE&K.===>> &&dATE_&K.; /* TO GET THE LAST QTR DATE - NOT SURE WHY AM I NOT ABLE TO GET IT */ %IF &i.= %EVAL(%SYSFUNC(MAX(&i.))) %THEN %DO; %PUT &I.; %LET BGNDTE = %SYSFUNC(INPUTN(&&PREVDTE&i., YYMMDD10.), 6.); %PUT BGNDTE ==>> &BGNDTE. ; %LET PDSTART = %SYSFUNC(INPUTN(&&PREVDTE&i., YYMMDD10.), YYMMN6.); %PUT PDSTART===>> &PDSTART.; %END; %END; %MEND; %QTRS; /*LOGS*/


1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
68
69 /*programmatically obtain dates*/
70 /*MY CODE*/
71 /*INITALLY I WAS PLANNING TO GET ALL THE MONTHS FOR AN YEAR AND BREAK THEM INTO QTRS, BUT I FAILED TO. SO USED ORIGINAL
71 ! CODE ABOVE */
72 DATA _NULL_;
73 YR_START_DATE=INTNX('MONTH', DATE(), -1, 'B');
74 YR_END_DATE=INTNX('MONTH', DATE(), -12, 'E');
75
76 DO UNTIL(YR_END_DATE>YR_START_DATE);
77 i+1;
78 MNTH_START_DATE=YR_START_DATE;
79 MNTH_END_DATE=INTNX('MONTH', MNTH_START_DATE, 0, 'S');
80 PREVDTE=INTNX('MONTH', MNTH_START_DATE, -1, 'S');
81
82 /*PREVIOUS MONTHS DATE*/
83 PUT MNTH_START_DATE=YYMMDD10. MNTH_END_DATE=YYMMDD10. PREVDTE=YYMMDD10.;
84 CALL SYMPUT(CATS('MNTH', I), PUT(MNTH_START_DATE, YYMMN6.));
85 CALL SYMPUT(CATS('MNTHSTDT', I), PUT(MNTH_START_DATE, YYMMN6.));
86 CALL SYMPUT(CATS('MNTHENDDT', I), PUT(MNTH_END_DATE, YYMMN6.));
87 CALL SYMPUT(CATS('DATE', I), PUT(MNTH_END_DATE, YYMMN6.));
88
89 /*FIRST MONTHS DATE YYMM AS TRANSACTION DATE*/
90 CALL SYMPUT(CATS('ATMDATE', I), PUT(PREVDTE, YYMMN6.));
91
92 /*PRIVOUS MONTHS DATE YYMM AS TRANSACTION DATE*/
93 CALL SYMPUT(CATS('PREVDTE', I), PUT(INTNX('MONTH', MNTH_START_DATE, -1, 'S'),
94 YYMMDD10.));
95
96 /*PRIVOUS MONTHS DATE YYMMDD AS TRANSACTION DATE*/
97 YR_START_DATE=INTNX('MONTH', YR_START_DATE, -1);
98 END;
99 PUT YR_START_DATE YR_END_DATE;
100 RUN;

MNTH_START_DATE=2022-08-01 MNTH_END_DATE=2022-08-01 PREVDTE=2022-07-01
MNTH_START_DATE=2022-07-01 MNTH_END_DATE=2022-07-01 PREVDTE=2022-06-01
MNTH_START_DATE=2022-06-01 MNTH_END_DATE=2022-06-01 PREVDTE=2022-05-01
MNTH_START_DATE=2022-05-01 MNTH_END_DATE=2022-05-01 PREVDTE=2022-04-01
MNTH_START_DATE=2022-04-01 MNTH_END_DATE=2022-04-01 PREVDTE=2022-03-01
MNTH_START_DATE=2022-03-01 MNTH_END_DATE=2022-03-01 PREVDTE=2022-02-01
MNTH_START_DATE=2022-02-01 MNTH_END_DATE=2022-02-01 PREVDTE=2022-01-01
MNTH_START_DATE=2022-01-01 MNTH_END_DATE=2022-01-01 PREVDTE=2021-12-01
MNTH_START_DATE=2021-12-01 MNTH_END_DATE=2021-12-01 PREVDTE=2021-11-01
MNTH_START_DATE=2021-11-01 MNTH_END_DATE=2021-11-01 PREVDTE=2021-10-01
MNTH_START_DATE=2021-10-01 MNTH_END_DATE=2021-10-01 PREVDTE=2021-09-01
22524 22553
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
user cpu time 0.01 seconds
system cpu time 0.00 seconds
memory 606.50k
OS Memory 23716.00k
Timestamp 09/10/2022 04:42:54 AM
Step Count 277 Switch Count 0
Page Faults 0
Page Reclaims 91
Page Swaps 0
Voluntary Context Switches 0
Involuntary Context Switches 0
Block Input Operations 0
Block Output Operations 0


101
102 /* I AM TRYING TO ARRANGE THE DATASETS FOR EVERY QUARTER WHICH CAN BE HELPFUL FOR ANALYSIS AND SPACE */
103 %MACRO QTRS();
104 %DO i=1 %TO 3;/*TRYING FOR THE 1ST QTR*/
105 %LET K = %EVAL(&i.+1);
106 /* TO GET THE PREVIOUS DATES FOR THE PREVIOUS MONTHS */
107 %LET CURR_DATE_&K. = &&PREVDTE&i.;
108 %PUT &&CURR_DATE_&K.;
109
110 %LET ATMDATE&i. = %SYSFUNC(INPUTN(&&CURR_DATE_&K., YYMMDD10.), YYMMN6.);
111 %PUT ATM&i.===>> &&ATMDATE&i.;
112 %LET DATE_&K. = %SYSFUNC(INPUTN(&&CURR_DATE_&K., YYMMDD10.), YYMMN6.);
113 %PUT DATE&K.===>> &&dATE_&K.;
114
115 /* TO GET THE LAST QTR DATE - NOT SURE WHY AM I NOT ABLE TO GET IT */
116 %IF &i.= %EVAL(%SYSFUNC(MAX(&i.))) %THEN %DO;
117 %PUT &I.;
118 %LET BGNDTE = %SYSFUNC(INPUTN(&&PREVDTE&i., YYMMDD10.), 6.);
119 %PUT BGNDTE ==>> &BGNDTE. ;
120 %LET PDSTART = %SYSFUNC(INPUTN(&&PREVDTE&i., YYMMDD10.), YYMMN6.);
121 %PUT PDSTART===>> &PDSTART.;
122 %END;
123
124 %END;
125 %MEND;
126
127 %QTRS;
2022-07-01
ATM1===>> 202207
DATE2===>> 202207
1
BGNDTE ==>> 22827
PDSTART===>> 202207
2022-06-01
ATM2===>> 202206
DATE3===>> 202206
2
BGNDTE ==>> 22797
PDSTART===>> 202206
2022-05-01
ATM3===>> 202205
DATE4===>> 202205
3
BGNDTE ==>> 22766
PDSTART===>> 202205
128
129
130
131
132
133 /*ORIGINAL CODE*/
134
135 DATA _NULL_;
136 TDY = MDY(MONTH(TODAY()),1,YEAR(TODAY()));
137 ENDATE = TDY - 1;
138 STDATE = MDY(MONTH(ENDATE),1,YEAR(ENDATE));
139 /*CREATE CURRENT START DATE AND END DATE OF THE MONTHS 1ST & LAST DAY OF THE MONTH*/
140 CALL SYMPUTX('MNSTRT',PUT(STDATE ,YYMMDD10.));
141 CALL SYMPUTX('MNENDT',PUT(ENDATE,YYMMDD10.));
142 CALL SYMPUTX('DATE1',PUT(STDATE,YYMMN6.));
143 /*PRIOR MONTHS -1 MONTH*/
144 CURR_DTE_2 = INTNX('MONTH',STDATE,-1,'S');
145 CALL SYMPUTX ('DATE2',PUT(CURR_DTE_2 ,YYMMN6.));
146 CALL SYMPUTX ('TXNDATE1',PUT(CURR_DTE_2 ,YYMMN6.));
147
148 /*PRIOR MONTHS -2 MONTH*/
149 CURR_DTE_3 = INTNX('MONTH',STDATE,-2,'S');
150 CALL SYMPUTX ('DATE3',PUT(CURR_DTE_3 ,YYMMN6.));
151 CALL SYMPUTX ('TXNDATE2',PUT(CURR_DTE_3 ,YYMMN6.));
152 CALL SYMPUTX ('QTRNDATE',PUT(CURR_DTE_3 ,YYMMDD10.)); /*THIS WILL END FOR THE QTR*/
153
154 /*3 MONTHS PRIOR*/
155 CURR_DTE_4 = INTNX('MONTH',STDATE,-3,'S');
156 CALL SYMPUTX ('TXNDATE3',PUT(CURR_DTE_4 ,YYMMN6.));
157
158 /*TO CREATE THE NUMBER OF DAYS(SAS DAYS)*/
159 CALL SYMPUTX('BGDTE',CURR_DTE_3);
160 CALL SYMPUTX('endt',ENDATE);
161 PUT CURR_DTE_4 = YYMMDD10. CURR_DTE_3 = YYMMDD10. CURR_DTE_2 = YYMMDD10. STDATE=YYMMDD10. ENDATE = YYMMDD10.;
162 RUN;

CURR_DTE_4=2022-05-01 CURR_DTE_3=2022-06-01 CURR_DTE_2=2022-07-01 STDATE=2022-08-01 ENDATE=2022-08-31
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
user cpu time 0.00 seconds
system cpu time 0.00 seconds
memory 561.25k
OS Memory 23716.00k
Timestamp 09/10/2022 04:42:54 AM
Step Count 278 Switch Count 0
Page Faults 0
Page Reclaims 32
Page Swaps 0
Voluntary Context Switches 0
Involuntary Context Switches 0
Block Input Operations 0
Block Output Operations 8


163
164 %put date1====>> &date1. date2====>> &date2. date3====>> &date3.;
date1====>> 202208 date2====>> 202207 date3====>> 202206
165 %put TXNDATE1====>> &TXNDATE1. TXNDATE2====>> &TXNDATE2. TXNDATE3====>> &TXNDATE3.; /*atmdates*/
TXNDATE1====>> 202207 TXNDATE2====>> 202206 TXNDATE3====>> 202205
166 %PUT BGNDTE ==>> &BGDTE. ;
BGNDTE ==>> 22797
167 %PUT endDTE ==>> &endt.;
endDTE ==>> 22888
168
169
170 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
180


 

1 ACCEPTED SOLUTION

Accepted Solutions
Kurt_Bremser
Super User

Use the YYQ Format for your dates, and base your further actions on the formatted value.

Statistical procedures will use the formatted values for grouping, and splitting datasets is rarely needed for analysis. What are you trying to do with the splits?

View solution in original post

1 REPLY 1
Kurt_Bremser
Super User

Use the YYQ Format for your dates, and base your further actions on the formatted value.

Statistical procedures will use the formatted values for grouping, and splitting datasets is rarely needed for analysis. What are you trying to do with the splits?

SAS Innovate 2025: Call for Content

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 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 1 reply
  • 357 views
  • 0 likes
  • 2 in conversation