2017-03-06 69 views
0

我想让SAS数据集根据日期自动限制结果,但不希望手动通过%Let语句手动更改日期。需要类似日期功能的%EVAL

如果我尝试

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

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

谢谢!

+1

变化'%eval'为'%sysfunc',你需要一个'%sysfunc'在各功能的前。 'mdy','month','today','year'。 –

回答

2

根据你在做什么,你或者不需要任何东西,或者你需要%SYSFUNC

如果你想有&begindate评价一个实际日期值,你可以使用%SYSFUNC

但是,你有五个函数 - 这将需要一堆sysfuncs,但我认为我们可以做两个而不是五个。

%let begindate = %sysfunc(intnx(MONTH,%sysfunc(today()),0,b)); 
%put &begindate; 

我们使用INTNX与月份和B(eginning)选项告诉SAS先走0个月(所以当月)和去那个月初。第二个SYSFUNC抓取TODAY()。你可以简化这个更多:

%let begindate = %sysfunc(intnx(MONTH,"&sysdate."d,0,b)); 
%put &begindate; 

&SYSDATE是存储在SAS启动系统的日期宏变量;所以只有在这种情况下才能使用(即,如果SAS可能/今天肯定启动)。

与SYSFUNC不要忘记,你需要删除引号,以上的日期常量的一个大的例外 - 这是可以使用它们 - 但注意“MONTH”和“b”没有引用。

3

@乔的方法是最直接的。此外,如果你想做到这一点在具有类似语法datastep你可以这样做:

data _null_; 
    call symputx('BeginDate_ds',mdy(month(today()),1,year(today()))); 
run; 

%put &BeginDate_ds.;