Что макрос делает ниже в отношении дат (месяцев).Устанавливает ли период времени один месяц и какой месяц каждый раз? - PullRequest
0 голосов
/ 27 марта 2019

Я считаю количество строк, используя статические даты (например, поле даты> = 01/02/2019 и поле даты <= 28/02/2019), и я получаю х количество строк. Мой отчет должен выполняться ежемесячно </p>

Автоматический отчет, разработанный кем-то другим, определяет период времени (должен быть один месяц), определяет период времени с помощью макроса ниже.И за тот же период времени этот отчет дает y количество строк.

Может ли кто-нибудь объяснить, что делает макрос ниже на простом английском языке (само собой разумеется, мои навыки sas и proc sql очень ограничены)

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

/*%macro (today = );*/
option MPRINT MLOGIC symbolgen;

data _null_;
M_month =  month(&today);
if M_month in (1 2 3 4 5 6) then
        call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));
else
        call symput('M_StartDate', put(intnx('month', &today ,4-M_month,'beginning'), date9.));


if M_month in ( 5 6)then
        call symput('M_EndDate', put(intnx('month', &today ,3-M_month,'end'), date9.));
else  if  M_month in ( 11 12) then
        call symput('M_EndDate', put(intnx('month', &today ,9-M_month,'end'), date9.));
else
        call symput('M_EndDate', put(intnx('month', &today ,-1,'end'), date9.));


call symput('M_CuttOffDate', put(intnx('month', &today , -1,'end'), date9.));


 call symput('run_MMMYY', put(intnx('month', &today , 0,'end'), EURDFMY5.));


run;

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Последние два просты. Cuttoff - последний день предыдущего месяца. Последний МММГГ - это текущий месяц в этом формате.

Для двух других это регулирует, насколько изменить дату в зависимости от месяца года.

Чтобы понять это, вы можете составить небольшую таблицу истинности с одной строкой в ​​месяц года и столбцами для различных целевых макропеременных. Поэтому, возможно, просто запишите месяц СЕГОДНЯ, а затем, какой месяц будет сгенерирован для новых макропеременных.

data _null_;
do m_month=1 to 12 ;
  today = mdy(m_month,1,2018);
  if M_month in (1 2 3 4 5 6) then M_StartDate = intnx('month', today ,-2-M_month,'b');
  else M_StartDate = intnx('month', &today ,4-M_month,'b');

  if M_month in ( 5 6)then M_EndDate = intnx('month', today ,3-M_month,'e');
  else if  M_month in ( 11 12) then M_EndDate = intnx('month', today ,9-M_month,'e');
  else M_EndDate = intnx('month', today ,-1,'end');

  put (today m_startdate m_enddate) (=yymmdd10.);
end;
run;

Результат

today=2018-01-01 M_StartDate=2017-10-01 M_EndDate=2017-12-31
today=2018-02-01 M_StartDate=2017-10-01 M_EndDate=2018-01-31
today=2018-03-01 M_StartDate=2017-10-01 M_EndDate=2018-02-28
today=2018-04-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-05-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-06-01 M_StartDate=2017-10-01 M_EndDate=2018-03-31
today=2018-07-01 M_StartDate=2018-04-01 M_EndDate=2018-06-30
today=2018-08-01 M_StartDate=2018-03-01 M_EndDate=2018-07-31
today=2018-09-01 M_StartDate=2018-02-01 M_EndDate=2018-08-31
today=2018-10-01 M_StartDate=2018-01-01 M_EndDate=2018-09-30
today=2018-11-01 M_StartDate=2017-12-01 M_EndDate=2018-09-30
today=2018-12-01 M_StartDate=2017-11-01 M_EndDate=2018-09-30
0 голосов
/ 27 марта 2019
  1. Удалите функцию symput вызова и вместо нее создайте переменные.

    call symput('M_StartDate', put(intnx('month', &today ,-2-M_month,'beginning'), date9.));
    

Становится:

M_StartDate = put(intnx('month', &today ,-2-M_month,'beginning'), date9.);
Удалите & сегодня, чтобы вместо него использовать переменную сегодня

Добавьте цикл для циклического просмотра дат, чтобы увидеть различные диапазоны.

data demo;


do today='01Jan2019'd to '31Dec2019'd;
M_month=month(today);

if M_month in (1 2 3 4 5 6) then
    M_StartDate=put(intnx('month', today , -2-M_month, 'beginning'), date9.);
else
    M_StartDate=put(intnx('month', today , 4-M_month, 'beginning'), date9.);

if M_month in (5 6)then
    M_EndDate=put(intnx('month', today , 3-M_month, 'end'), date9.);
else if M_month in (11 12) then
    M_EndDate=put(intnx('month', today , 9-M_month, 'end'), date9.);
else
    M_EndDate=put(intnx('month', today , -1, 'end'), date9.);
M_CuttOffDate=put(intnx('month', today , -1, 'end'), date9.);
run_MMMYY=put(intnx('month', today , 0, 'end'), EURDFMY5.);
output;
end;
run;

Затем вы можете проверить выходные данные и посмотреть, какие диапазоны есть, и соответствуют ли они вашим ожиданиям.Это выглядит как динамический диапазон, который меняется.

...