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



我正试图使用下面的调用信号来获取前一周最近的周五和周日。例如,如果我今天(2016年5月17日)运行它,那么它应该会在2016年13月5日和2016年15月5日运行。然而,我得到了奇怪的结果。我第一次运行这段代码时,结果没有日期,或者结果是2016年5月6日和2016年8月5日。如果我立即再次运行同一段代码,那么它会提供正确的日期。每次打开新的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;

Robert下面的评论很好地解释了这里发生的事情:

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

在本页中间讨论了一个类似的例子;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;

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

%put NOTE: &=BEG &=END;

最新更新