Использование кейс-функции в макросе для даты - PullRequest
0 голосов
/ 08 ноября 2018

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

%let eomb=%sysfunc(Case 
when %sysfunc(weekday(intnx(month, "&sysdate", -1, end))=1) then %sysfunc(intnx(month, "&sysdate", -1, end)-2)
when %sysfunc(weekday(intnx(month, "&sysdate", -1, end))=7) then %sysfunc(intnx(month, "&sysdate", -1, end)-1)
else %sysfunc(intnx(month, "&sysdate", -1, end))
end);

%put &eomb.;


proc sql;

create table SNAP_DT
    (SNAP_DT DATE FORMAT = date9.
                  INFORMAT = date9.);

INSERT INTO SNAP_DT
    Values (&eomb);

    run;

1 Ответ

0 голосов
/ 08 ноября 2018

Вы не можете использовать CASE в такой функции макроса. Вы можете использовать IFN или IFC, хотя. Хотя вы можете получить то же самое, используя INTNX. Вот один из подходов.

  1. Используйте DATA null, чтобы избежать проблем с макро функциями
  2. Использовать NWKDOM - который находит n-й день месяца / года. Вы должны знать месяц / год, поэтому нужно сначала рассчитать это.
  3. используйте CALL SYMPUTX для создания макропеременной

    data _null_;
    prev_month = intnx('month', today(), -1, 'b');
    x=nwkdom(5, 6, month(prev_month), year(prev_month));
    call symputx('eomb', x, 'g');
    run;
    
    %put &eomb.;
    

Вы можете вложить все это в макрофункции, но это много% SYSFUNC (), который раздражает отладку.

%let eomb2 = %sysfunc(nwkdom(5, 
                            6, 
                            %sysfunc(month(%sysfunc(intnx(month, %sysfunc(today()), -1, b)))), 
                            %sysfunc(year(%sysfunc(intnx(month, %sysfunc(today()), -1, b))))
                             )
                        );
%put &eomb2;
...