#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’);