【问题标题】:SAS Call Symput - INTNX returning inconsistent datesSAS 调用符号 - INTNX 返回不一致的日期
【发布时间】:2016-09-13 14:10:18
【问题描述】:

我正在尝试使用下面的调用符号来获取前一周最近的周五和周日。例如,如果我今天(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;

【问题讨论】:

    标签: date macros sas


    【解决方案1】:

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

    更多的是了解宏预处理器的工作原理。基本的经验法则是不要尝试在使用 symput 时创建的同一数据步中访问宏变量。如果你绝对需要,你可以使用 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;
    

    【讨论】:

    • 是的...看起来可以修复它。感谢您的帮助!
    • 您应该提供链接中包含的信息的概要(以防链接中断)。此外,它与“编译”无关,更多的是与了解宏预处理器的工作原理有关。基本的经验法则是不要尝试在使用symput 时创建的同一数据步中访问宏变量。如果你绝对需要,你可以使用symget 来解决这个问题。
    • @RobertPenr​​idge 听起来你应该把它作为答案发布 - 这是正确的,IMO。
    • 谢谢罗伯特,这是非常有用的信息!我会记住这一点,以便将来使用宏。
    • @superfluous - 随意在你的答案中复制/粘贴/解释我的 cmets 而不仅仅是引用它
    【解决方案2】:

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

    %put NOTE: &=BEG &=END;
    

    【讨论】:

    • 为什么?这个答案并不能真正帮助 OP 了解出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多