получить конкретный день недели с предыдущей недели через макрос sas - PullRequest
1 голос
/ 18 октября 2011

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

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

Например:

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

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

Спасибо

Ответы [ 3 ]

4 голосов
/ 18 октября 2011

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

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

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

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

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

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

3 голосов
/ 19 октября 2011

Если вы хотите вызвать макрос, чтобы вернуть дату самой последней среды. (Также, если вы хотите, чтобы дата просто сохранялась в макросе var ... удалите оператор "& weekday;")

%Macro Get_Weekday(date);

 %Let weekday=%sysfunc(putn(
                 %sysfunc(intnx(week.4,&date,0,beginning)),weekdate.));
 &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));
2 голосов
/ 19 октября 2011

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

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

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

code

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

log

      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
...