在宏中使用案例函数作为日期

时间:2018-11-08 20:11:14

标签: sas

我正在尝试创建一个表,该表始终使用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 :(得分:1)

您不能在这样的宏函数中使用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;