需要像%EVAL这样的日期功能

时间:2017-03-06 21:40:23

标签: sas

我试图让SAS数据集根据日期自动限制结果,但不想手动通过%Let语句手动更改日期。

如果我尝试

%let BeginDate = %EVAL(MDY(MONTH(TODAY()), 1, YEAR(TODAY()));

我得到一个"检测到开放代码语句递归" ...我已经尝试过&SYSFUNC和& SYSEVALF,但也没有运气。看起来这应该更加简单......任何建议肯定会受到赞赏。

谢谢!

2 个答案:

答案 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"没有被引用。