SAS Call Symput - INTNX返回不一致的日期

时间:2016-05-17 12:50:21

标签: date macros sas

我正在尝试使用下面的电话会议来抓住上一周的最近一个周五和周日。例如,如果我今天(2016年5月17日)运行它,它应该抓住2016年5月13日和2016年5月15日。但是,我得到了奇怪的结果。我第一次运行这段代码时,没有日期,或者导致5/6/2016和5/8/2016。如果我立即再次运行相同的代码,那么它提供正确的日期。每次打开新的SAS会话时都会发生这种情况。不确定我做错了什么。任何帮助将不胜感激......

data _null_;

%global beg end;

call symput ('beg',"'"||put(intnx('week.6',date(),-0,'b'),mmddyy10.)||"'");
call symput ('end',"'"||put(intnx('week.1',date(),-0,'b'),mmddyy10.)||"'");

put &beg;
put &end;
run;

2 个答案:

答案 0 :(得分:2)

罗伯特在下面的评论很好地解释了这里发生了什么:

  

更多的是要了解宏预处理器的工作原理。基本的经验法则是不要尝试在使用symput时创建的相同datastep中访问宏变量。如果你绝对必须,你可以通过使用symget来解决这个问题

this page的中间讨论了一个类似的例子; control + f“解决数据步骤编译过程中出现的宏分辨率问题”。以下代码应该可以解决您的问题!

%global beg end;

data _null_;
    call symput ('beg',"'"||put(intnx('week.6',date(),-0,'b'),mmddyy10.)||"'");
    call symput ('end',"'"||put(intnx('week.1',date(),-0,'b'),mmddyy10.)||"'");
run;

data _null_;
    put &beg.;
    put &end.;
run;

答案 1 :(得分:-1)

在RUN之后应该使用%PUT来查看宏变量BEG和END的值。无需额外的数据步骤。

%put NOTE: &=BEG &=END;