Can't seem to get a YYYY/-1(Q) Macro to work...
Below is the code I am using and works fine calculating a single value for the Previous Quarter.
I guess I could append the -1 Quarters to the current year, but for SAS seems like an odd way to accomplish the goal.
Thanks In Advance.
~J
/* Start Of Date Macro Built */
/*************************************/
Data _Null_;
%let Date = %sysfunc(today(),mmddyy10.);
%let CYear = %sysfunc(today(),Year4.);
%let RuleYearCurrent = %sysfunc(today(),Year4.);
%let CurrentYYYYQQ = %sysfunc(today(),yyqs8.);
/**********************************************************************************************************************/
/* Cant seem to figure out the SysFunc macro to subtract 1 quarter from current quarter */
/* I am looking for the current years previous quarter. */
/* CurrrentYYYYQQ = 2023/3 which is correct */
/* I am looking for this: PreviousYYYYQQ = 2023/2 */
/*********************************************************************************************************************/
/*%let PreviousYYYYQQ = %sysfunc(yyqs(%sysfunc(intnx(yyqs,%sysfunc(date()),-1)))); <- Problem Is Here */
/*********************************************************************************************************************/
%let CurrentQtr = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-0))));
%let CurrentQtr_m1 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-1))));
%let CurrentQtr_m2 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-2))));
%let CurrentQtr_m3 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-3))));
%put >>>>> Current Year Quarter Is : &CurrentYYYYQQ;
%put >>>>> High Level Dates: Current Quarter : &CurrentQtr.;
%put >>>>> High Level Dates: Current Quarter -1 : &CurrentQtr_m1.;
%put >>>>> High Level Dates: Current Quarter -2 : &CurrentQtr_m2.;
%put >>>>> High Level Dates: Current Quarter -3 : &CurrentQtr_m3.;
Run;
Below is SAS Log With Macro Display:
Data _Null_;
%let Date = %sysfunc(today(),mmddyy10.);
%let CYear = %sysfunc(today(),Year4.);
%let RuleYearCurrent = %sysfunc(today(),Year4.);
%let CurrentYYYYQQ = %sysfunc(today(),yyqs8.);
/**********************************************************************************************************************/
/* Cant seem to figure out the SysFunc macro to subtract 1 quarter from current quarter */
/* I am looking for the current years previous quarter. */
/* CurrrentYYYYQQ = 2023/3 which is correct */
/* I am looking for this: PreviousYYYYQQ = 2023/2 */
/*********************************************************************************************************************/
/*%let PreviousYYYYQQ = %sysfunc(yyqs(%sysfunc(intnx(yyqs,%sysfunc(date()),-1))));*/
/*********************************************************************************************************************/
%let CurrentQtr = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-0))));
%let CurrentQtr_m1 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-1))));
%let CurrentQtr_m2 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-2))));
%let CurrentQtr_m3 = %sysfunc(qtr(%sysfunc(intnx(qtr,%sysfunc(date()),-3))));
%put >>>>> Current Year Quarter Is : &CurrentYYYYQQ;
>>>>> Current Year Quarter Is : 2023/3
%put >>>>> High Level Dates: Current Quarter : &CurrentQtr.;
>>>>> High Level Dates: Current Quarter : 3
%put >>>>> High Level Dates: Current Quarter -1 : &CurrentQtr_m1.;
>>>>> High Level Dates: Current Quarter -1 : 2
%put >>>>> High Level Dates: Current Quarter -2 : &CurrentQtr_m2.;
>>>>> High Level Dates: Current Quarter -2 : 1
%put >>>>> High Level Dates: Current Quarter -3 : &CurrentQtr_m3.;
>>>>> High Level Dates: Current Quarter -3 : 4
Run;
If you want generate a string in the style YYYY/Q then use the YYQS format.
To use that format you need a DATE value.
%let today=%sysfunc(date());
%let q0 = %sysfunc(putn(&today,yyqs.));
%let q1 = %sysfunc(intnx(qtr,&today,-1),yyqs.);
%put &=today &=q0 &=q1;
1312 %let today=%sysfunc(date()); 1313 %let q0 = %sysfunc(putn(&today,yyqs.)); 1314 %let q1 = %sysfunc(intnx(qtr,&today,-1),yyqs.); 1315 %put &=today &=q0 &=q1; TODAY=23232 Q0=2023/3 Q1=2023/2
If you want to convert a sting like YYYY/Q into a DATE value then use the YYQ informat. But that informat wants a Q and not an slash between the year and the quarter. You could use %SCAN() tease out the year and the quarter.
%let q2 = %sysfunc(intnx(qtr,%sysfunc(inputn(%scan(&q1,1,/)Q%scan(&q1,2,/),yyq6.)),-1),yyqs.);
%put &=q2;
1344 %let q2 = %sysfunc(intnx(qtr,%sysfunc(inputn(%scan(&q1,1,/)Q%scan(&q1,2,/),yyq6.)),-1),yyqs.); 1345 %put &=q2; Q2=2023/1
Or use the YYQ() function instead of INPUTN() function.
1346 %let q2 = %sysfunc(intnx(qtr,%sysfunc(yyq(%scan(&q1,1,/),%scan(&q1,2,/))),-1),yyqs.); 1347 %put &=q2; Q2=2023/1
If you want generate a string in the style YYYY/Q then use the YYQS format.
To use that format you need a DATE value.
%let today=%sysfunc(date());
%let q0 = %sysfunc(putn(&today,yyqs.));
%let q1 = %sysfunc(intnx(qtr,&today,-1),yyqs.);
%put &=today &=q0 &=q1;
1312 %let today=%sysfunc(date()); 1313 %let q0 = %sysfunc(putn(&today,yyqs.)); 1314 %let q1 = %sysfunc(intnx(qtr,&today,-1),yyqs.); 1315 %put &=today &=q0 &=q1; TODAY=23232 Q0=2023/3 Q1=2023/2
If you want to convert a sting like YYYY/Q into a DATE value then use the YYQ informat. But that informat wants a Q and not an slash between the year and the quarter. You could use %SCAN() tease out the year and the quarter.
%let q2 = %sysfunc(intnx(qtr,%sysfunc(inputn(%scan(&q1,1,/)Q%scan(&q1,2,/),yyq6.)),-1),yyqs.);
%put &=q2;
1344 %let q2 = %sysfunc(intnx(qtr,%sysfunc(inputn(%scan(&q1,1,/)Q%scan(&q1,2,/),yyq6.)),-1),yyqs.); 1345 %put &=q2; Q2=2023/1
Or use the YYQ() function instead of INPUTN() function.
1346 %let q2 = %sysfunc(intnx(qtr,%sysfunc(yyq(%scan(&q1,1,/),%scan(&q1,2,/))),-1),yyqs.); 1347 %put &=q2; Q2=2023/1
Thanks Tom...
Just what I was looking for...
Appreciate it...
J
You do not need a DATA _NULL_ step to execute macro statements, you can safely omit that..
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
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.