получить определенный день недели с предыдущей недели с помощью макроса sas

#date #macros #sas #dayofweek #sas-macro

#Дата #макросы #sas #день недели #sas-макрос

Вопрос:

Кто-нибудь знает, как создать переменную макроса с помощью процесса макрокоманды sas, чтобы получить конкретный день недели?

Я хотел бы получать дату среды за предыдущую неделю каждый раз, когда я запускаю макрос sas.

Например :

Сегодня: вторник, 18 октября 2011 года -> если я запущу макрос сегодня, я хотел бы получить: «Среда, 12 октября 2011 года»

и если я запущу макрос в понедельник, я все равно хочу получить «Среда, 12 октября 2011»

Спасибо,

Ответ №1:

Вы можете выполнить это с помощью intnx . Вот пример (не макрос, но он дает вам представление):

Сначала сгенерируйте некоторые данные:

 data dates;
 do d=0 to 13;
  date = '15oct2011'd   d;
  output;
 end;
 format date date8.;
run;
  

Это даст вам самую последнюю среду. Обратите внимание, что ‘неделя.4’ — это инструкция для недель, начинающихся в среду.

 data dates;
 set dates;
 wed=intnx('week.4',date,0,'beginning');
 format wed date8.;
run;
  

Переменная wed теперь содержит дату самой последней среды.

Ответ №2:

Если вы хотите вызвать макрос, чтобы вернуть дату самой последней среды. (Кроме того, если вы хотите, чтобы дата просто сохранялась в переменной макроса … удалите оператор «amp;weekday;».)

 %Macro Get_Weekday(date);

 %Let weekday=%sysfunc(putn(
                 %sysfunc(intnx(week.4,amp;date,0,beginning)),weekdate.));
 amp;weekday;

%Mend Get_Weekday;

%Put Today is %sysfunc(putn(%sysfunc(today()),weekdate.)) 
  and the most recent Wednesday is %Get_Weekday(%sysfunc(today()));
%Put If Today was %sysfunc(putn(%eval(%sysfunc(today())-1),weekdate.)) 
  then the most recent Wednesday would be 
   %Get_Weekday(%eval(%sysfunc(today())-1));
  

Ответ №3:

я интерпретировал ваш вопрос как «Как заставить SAS возвращать дату за среду прошлой недели независимо от текущего дня недели?»

если это ваш желаемый результат, тогда необходимы два intnx вызова: один вызов, чтобы вернуться к воскресенью прошлой недели ( lastwk=intnx('week', today, -1); ), а затем второй вызов, чтобы перейти к среде прошлой недели ( lastwed=intnx('week.4', lastwk , 1); ).

более простым способом могло бы быть возвращение к началу прошлой недели и простое добавление 3 к результату, но этот код больше похож на взлом, чем на преднамеренное смещение.

код

 data _null_;
    do i = -10 to 10;
        today="amp;SYSDATE9"d   i;
        lastwk=intnx('week', today, -1);
        lastwed=intnx('week.4', lastwk , 1);
        put today weekdate. '-->' lastwed weekdate.-l;
    end;
run;
  

журнал

       Sunday, October 9, 2011-->Wednesday, October 5, 2011
     Monday, October 10, 2011-->Wednesday, October 5, 2011
    Tuesday, October 11, 2011-->Wednesday, October 5, 2011
  Wednesday, October 12, 2011-->Wednesday, October 5, 2011
   Thursday, October 13, 2011-->Wednesday, October 5, 2011
     Friday, October 14, 2011-->Wednesday, October 5, 2011
   Saturday, October 15, 2011-->Wednesday, October 5, 2011
     Sunday, October 16, 2011-->Wednesday, October 12, 2011
     Monday, October 17, 2011-->Wednesday, October 12, 2011
    Tuesday, October 18, 2011-->Wednesday, October 12, 2011
  Wednesday, October 19, 2011-->Wednesday, October 12, 2011
   Thursday, October 20, 2011-->Wednesday, October 12, 2011
     Friday, October 21, 2011-->Wednesday, October 12, 2011
   Saturday, October 22, 2011-->Wednesday, October 12, 2011
     Sunday, October 23, 2011-->Wednesday, October 19, 2011
     Monday, October 24, 2011-->Wednesday, October 19, 2011
    Tuesday, October 25, 2011-->Wednesday, October 19, 2011
  Wednesday, October 26, 2011-->Wednesday, October 19, 2011
   Thursday, October 27, 2011-->Wednesday, October 19, 2011
     Friday, October 28, 2011-->Wednesday, October 19, 2011
   Saturday, October 29, 2011-->Wednesday, October 19, 2011
  

Комментарии:

1. Просто в качестве информации, если среда — желаемый день недели, вы всегда можете найти прошлую среду, используя следующее: lastwed=intnx(‘week’, today, -1, ‘m’);