我试图让SAS数据集根据日期自动限制结果,但不想手动通过%Let语句手动更改日期。
如果我尝试
%let BeginDate = %EVAL(MDY(MONTH(TODAY()), 1, YEAR(TODAY()));
我得到一个"检测到开放代码语句递归" ...我已经尝试过&SYSFUNC和& SYSEVALF,但也没有运气。看起来这应该更加简单......任何建议肯定会受到赞赏。
谢谢!
答案 0 :(得分:3)
@ Joe的方法是最直截了当的。此外,如果您想在具有类似语法的datastep中执行此操作,您可以这样做:
data _null_;
call symputx('BeginDate_ds',mdy(month(today()),1,year(today())));
run;
%put &BeginDate_ds.;
答案 1 :(得分:2)
根据您正在做的事情,您可能不需要任何内容,或者您需要%SYSFUNC
。
如果您想&begindate
评估实际日期值,请使用%SYSFUNC
。
但是,你有五个函数 - 这将需要一堆sysfuncs,虽然我认为我们可以做两个而不是五个。
%let begindate = %sysfunc(intnx(MONTH,%sysfunc(today()),0,b));
%put &begindate;
我们使用INTNX
和MONTH和B(eginning)选项告诉SAS继续0个月(当前月份)并转到该月初。第二个SYSFUNC抓取TODAY()。您可以更简化这一点:
%let begindate = %sysfunc(intnx(MONTH,"&sysdate."d,0,b));
%put &begindate;
&SYSDATE
是一个宏变量,用于存储SAS启动时的系统日期;所以,只有在你对此表示满意的情况下才能使用它(即,如果SAS可能/肯定是今天开始的话)。
使用SYSFUNC不要忘记你需要删除引号,除了上面的日期常量有一个很大的例外 - 可以使用它们 - 但是注意" MONTH"和" b"没有被引用。