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

Date SAS Call Symput-INTNX返回不一致的日期,date,macros,sas,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

我正在尝试使用下面的通话提示,从上周抓取最近的周五和周日。例如,如果我今天(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;

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

更重要的是了解宏预处理器的工作原理。基本的经验法则是,不要尝试在使用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;

运行后应使用%PUT查看宏变量BEG和END的值。不需要额外的数据步骤

%put NOTE: &=BEG &=END;

是的…看起来这样就解决了。谢谢你的帮助!您应该提供链接中包含的信息的概要(以防链接中断)。此外,它与“编译”无关,更重要的是了解宏预处理器的工作原理。基本的经验法则是不要尝试在使用
symput
时创建的相同数据步骤中访问宏变量。如果你必须这样做,你可以通过使用
symget
@RobertPenridge来解决这个问题。听起来你应该把它作为一个答案发布出来——这是正确的答案,IMO。谢谢罗伯特,这是非常有用的信息!我会记住这一点,以备将来使用宏时参考。@多余-请在回答中随意复制/粘贴/解释我的评论,而不仅仅是指它为什么?这个答案根本不能帮助OP了解出了什么问题。