Есть ли способ динамически изменять даты и записывать их в таблицу в SAS? - PullRequest
0 голосов
/ 26 апреля 2019

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

PS: я решил сделать их внутри данных null шаг, чтобы я мог использовать их для других запросов.

%let dtDMRT= 1FEB2016;
/*calculated dates */
DATA _null_;
DAY_DMRT_DEB = intnx('year',"&dtDMRT"d,-1);
format DAY_DMRT_DEB DATE9.;
call symputx('DAY_DMRT_DEB',DAY_DMRT_DEB);

DAY_DMRT_FIN = '&dtDMRT'd;
format DAY_DMRT_FIN DATE9.;
call symputx('DAY_DMRT_FIN',DAY_DMRT_FIN);

DATE_DMRT_1Y = intnx('year',"&dtDMRT"d,1);
format DATE_DMRT_1Y DATE9.;
call symputx('DATE_DMRT_1Y',DATE_DMRT_1Y);
run;


PROC SQL THREADS ; 
CREATE TABLE DATAMART_SEG AS  
SELECT *,
&DAY_DMRT_DEB as  DAY_DMRT_DEB  format= DATE9.,
&DAY_DMRT_FIN as  DAY_DMRT_FIN  format= DATE9.,
&DATE_DMRT_1Y As DATE_DMRT_1Y  format= DATE9.  
FROM  DMRT.MYDATAMART_&dtDMRT
RUN;

Первый тест с % let dtDMRT = 1JAN2016 ; Я получаю правильные результаты в WORK.DATAMART_SEG:

DAY_DMRT_DEB = '01JAN2015'd
DAY_DMRT_FIN = '01JAN2016'd
DATE_DMRT_1Y = '01JAN2017'd

Как бы то ни было с %, пусть dtDMRT = 1FEB2016; Я получаю:

DAY_DMRT_DEB = '01JAN2015'd
DAY_DMRT_FIN = '01FEB2016'd
DATE_DMRT_1Y = '01JAN2017'd

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

1 Ответ

1 голос
/ 26 апреля 2019

В соответствии с документацией для intnx по умолчанию для выравнивания установлено значение НАЧАЛО. То, что вы наблюдаете, абсолютно правильно. Установите для параметра algement значение SAME, и intnx будет делать то, что вы хотите.

DATA _null_;
DAY_DMRT_DEB = intnx('year',"&dtDMRT"d,-1,'SAME');
format DAY_DMRT_DEB DATE9.;
call symputx('DAY_DMRT_DEB',DAY_DMRT_DEB);

DAY_DMRT_FIN = "&dtDMRT"d;
format DAY_DMRT_FIN DATE9.;
call symputx('DAY_DMRT_FIN',DAY_DMRT_FIN);

DATE_DMRT_1Y = intnx('year',"&dtDMRT"d,1,'SAME');
format DATE_DMRT_1Y DATE9.;
call symputx('DATE_DMRT_1Y',DATE_DMRT_1Y);
run;  
...