I need to identify the previous working day and if the previous working day is a holiday then to identify the day before. I have input the holidays as a list. If the previous date is matching the holiday list then the previous working day should be -1 day. Please help... e.g Today is Monday (11DEC2023), Previous working day Friday (08DEC2023), Day Before Previous working day Thursday (07DEC2023) I need to get Thursday date. ===Code=== %let current_date = %sysfunc(today(),yymmddn8.);
%let holiday_list = 08DEC2023 25DEC2023;
/* Function to check if a date is in the holiday list */
%macro is_holiday(date);
%local i holiday;
%let holiday = 0;
%do i = 1 %to %sysfunc(countw(&holiday_list));
%if "&date." = %sysfunc(inputn(%scan(&holiday_list, &i.), yymmdd8.)) %then %do;
%let holiday = 1;
%leave;
%end;
%end;
&holiday
%mend;
/* Calculate the previous working day and adjust for holidays */
data _null_;
/* Convert the current date to SAS date format */
current_date_sas = input("¤t_date.", yymmdd8.);
/* Initialize variables */
previous_workday = current_date_sas;
i = 1;
/* Subtract days until a working day (Mon to Fri) is found */
do while (weekday(intnx('day', previous_workday, -i)) in (1, 7) or %is_holiday(intnx('day', previous_workday, -i)));
i = i + 1;
end;
/* Calculate the previous working day considering holidays */
previous_workday = intnx('day', previous_workday, -i);
/* Check if the result is a holiday and adjust further */
if %is_holiday(previous_workday) then
previous_workday = intnx('day', previous_workday, -2);
/* Format the result as a date and store it in a macro variable */
call symput('previous_workday', put(previous_workday, date9.));
run;
/* Display the result in the log */
%put Previous working day is &previous_workday.;
... View more