Итак, у меня есть ряд наборов данных в указанной c библиотеке. Эти наборы данных имеют имена в формате DATASET_YYYYMM, по одному набору данных на каждый месяц. Я пытаюсь добавить диапазон этих наборов данных на основе пользовательского ввода для диапазона дат. т.е. если start_date - 01NOV2019, а end_date - 31JAN2020, я хочу добавить три набора данных: LIBRARY.DATASET_201911, LIBRARY.DATASET_201912 и LIBRARY.DATASET_202001.
Диапазон, очевидно, переменный, поэтому я не могу просто назвать наборы данных вручную в заданной функции. Поскольку мне нужно провести l oop через годы и месяцы в диапазоне дат, я считаю, что макрос - лучший способ сделать это. Я использую al oop в операторе SET для добавления всех наборов данных. Я скопировал мой пример кода ниже. Это работает в теории. Но на практике, только если мы в цикле в течение ноября и декабря. Поскольку формат имени набора данных имеет два ди git месяца, для января-сентября это будет 01-09. Однако функция month возвращает 1-9, и, конечно, выдается ошибка «Файл DATASET_NAME не существует». Проблема в том, что я не могу найти способ заставить его интерпретировать месяц, начиная с нуля, не нарушая функциональность другой части цикла / макроса.
Я пробовал множество подходов, чтобы отформатировать число как z2, не могу заставить его работать. То есть, включая функции PUTN в строке DO для quote_month следующим образом, он игнорирует начальный ноль при генерации имени набора данных в строке ниже.
%DO quote_month = %SYSFUNC(IFN("e_year. = &start_year.,%SYSFUNC(PUTN(&start_month.,z2.)),1,.)) %TO %SYSFUNC(IFN("e_year. = &end_year.,%SYSFUNC(PUTN(&end_month.,z2.)),12,.));
Ниже приведен пример кода (без какой-либо попытки переформатировать его в z2 ) - он выдаст ошибку, потому что не может найти «dataset_20201», потому что он на самом деле называется «dataset_202001». Набор данных с именем dataset_combined_example создает желаемый вывод кода, вручную ссылаясь на имена наборов данных, что он не сможет сделать на практике. Кто-нибудь знает как go об этом?
DATA _NULL_;
FORMAT start_date end_date DATE9.;
start_date = '01NOV2019'd;
end_date = '31JAN2020'd;
CALL symput('start_date',start_date);
CALL symput('end_date',end_date);
RUN;
DATA dataset_201911;
input name $;
datalines;
Nov1
Nov2
;
RUN;
DATA dataset_201912;
input name $;
datalines;
Dec1
Dec2
;
RUN;
DATA dataset_202001;
input name $;
datalines;
Jan1
Jan2
;
RUN;
DATA dataset_combined_example;
SET dataset_201911 dataset_201912 dataset_202001;
RUN;
%MACRO get_table(start_date, end_date);
%LET start_year = %SYSFUNC(year(&start_date.));
%LET end_year = %SYSFUNC(year(&end_date.));
%LET start_month = %SYSFUNC(month(&start_date.));
%LET end_month = %SYSFUNC(month(&end_date.));
DATA dataset_combined;
SET
%DO quote_year = &start_year. %TO &end_year.;
%DO quote_month = %SYSFUNC(IFN("e_year. = &start_year.,&start_month.,1,.)) %TO %SYSFUNC(IFN("e_year. = &end_year.,&end_month.,12,.));
dataset_"e_year."e_month.
%END;
%END;
;
RUN;
%MEND;
%get_table(&start_date.,&end_date.);