Как я могу использовать разные наборы значений даты в зависимости от даты

Я хочу автоматизировать ежедневный отчет для своей компании, но столкнулся с небольшой проблемой. Отчет обновляется только 2-го рабочего дня каждого месяца. Я нашел код на веб-сайте SAS, который вычисляет, что такое второй рабочий день любого месяца.

data scdwrk;
  /* advance date to the first day of the month using the INTNX function */
  second=intnx('month',today(),0);
  /* determine the day of the week using the WEEKDAY function */
  day=weekday(second);
  /* if day=Monday then advance by 1 */
  if day=2 then second+1;
  /* if day=Sunday then advance by 2 */
  else if day=1 then second+2;
  format second date9.;
run ; 

Я также установил флаг, который сравнивает сегодняшнюю дату с датой, сгенерированной этим фрагментом кода. Теперь мне нужно найти способ, чтобы, если код запускается в первый рабочий день месяца, он запускал определенный набор переменных даты макроса.

%let start_date="&prevmnth;
%let end_date= &endprevmnth;
%let month= &prevyearmnth; 

а затем, когда он запускается во 2-й рабочий день месяца, он использует другой набор переменных даты макроса (календарный месяц)

%let start_date="&currmnth;
%let end_date= &endcurrmnth;
%let month= &curryearmnth;

Любая помощь по этому вопросу будет принята с благодарностью.


person Rossco2210    schedule 24.06.2015    source источник
comment
А если 1 числа месяца суббота? А если праздник? (Действительно ли второй рабочий день является первым вторником, предназначенным быть вторым ИЛИ первым, в зависимости от того, является ли это праздником, за исключением праздников, таких как 25 декабря или 7/4, которые не меняются...)?   -  person Joe    schedule 24.06.2015
comment
Привет Джо, спасибо за ответ. Компания готова сделать это вручную в случае государственных праздников и т. д., но в этой области мы очень редко встречаемся, когда эти праздники влияют на нас.   -  person Rossco2210    schedule 24.06.2015
comment
Перечитывая это, я не могу понять, в чем именно вопрос. У вас есть код, который работает (это не совсем то, что я бы использовал, но кажется достаточно хорошим). Какой вопрос? Вы спрашиваете, как сделать макропеременные из шага данных?   -  person Joe    schedule 24.06.2015
comment
Вопрос, который, я думаю, актуален для автоматического переключения с использования одного набора значений даты в коде на другой набор значений даты. Возьмем, к примеру, июнь. 1 июня мне нужно, чтобы программа работала с датами от мая, поскольку данные Maysa все еще используются, поэтому я устанавливаю переменные макроса, чтобы они содержали дату предыдущего месяца (сейчас май). Приходите 2 июня (2-й рабочий день) программе необходимо переключиться на данные за июнь, поэтому ее необходимо запустить с макропеременными текущего месяца, которые были созданы вместо предыдущих месяцев. Я хотел бы найти способ автоматизировать этот процесс.   -  person Rossco2210    schedule 25.06.2015


Ответы (1)


У меня есть недавний код, который делает именно это. Вот как я с этим справился.

Сначала создайте таблицу праздников. Это может поддерживаться ежегодно.

Во-вторых, создайте таблицу с первыми 5 днями месяца, которые не являются выходными днями.

В-третьих, удалить праздники.

Наконец, получите второе значение в наборе данных.

data holidays;
format holiday_date date9.;
informat holiday_date date9.;
input holiday_date;
datalines;
01JAN2015
19JAn2015
16FEB2015
03APR2015
25MAY2015
03JUL2015
07SEP2015
26NOV2015
25DEC2015
;

data _dates;
firstday = intnx('month',today(),0);
format firstday date date9.;
do date=firstday to firstday+5;
    if 1 < weekday(date) < 7 then
        output;
end;
run;

proc sql noprint;
delete from _dates
where date in (select holiday_date from holidays);

quit;

data _null_;
set _dates(firstobs=2);
call symput("secondWorkDay",put(date,date9.));
stop;
run;

%put &secondWorkDay;
person DomPazz    schedule 24.06.2015
comment
Спасибо тебе большое за это. это определенно лучше, чем версия на странице SAS. - person Rossco2210; 25.06.2015