write conditional in SAS with DATA _NULL_



我正在编写SAS中的条件,以DATANULL

%LET today = today();
DATA _NULL_;
if day(today) ge 1 and day(today) le 15 then do;
date1=put(intnx('month',today,-1,'E'), date11.);
date2=put(intnx('month',today,-1,'L'), date11.);
end;
if day(today) > 15 then do;
date1=put(intnx('month',today,0,'B'), date11.);
date2=put(intnx('month',today,0,'L'), date11.);
end;
call symput('report_date',date1);
call symput('report_date2',date2);
RUN;

但是上面,我没有得到任何值为我的report_dates。

的条件是:

date 1 =如果当前日期大于等于1且小于16,则将date1设置为前一个月的16号,否则设置为当前月份的1号

date2 =如果当前日期为16及以上,则将date2设置为当前月的15号,否则将date2设置为上个月的最后一天

IF/THEN逻辑不考虑传递给DAY()函数调用的缺失值。

变量TODAY永远不会在数据步骤中创建。因此,只需删除%LET语句,并添加一个实际的赋值语句。

DATA _NULL_;
today=today();
if day(today) ge 1 and day(today) le 15 then do;
...

仅仅因为在%LET语句中对宏变量使用了与在data步骤中对变量使用的相同的名称,并不意味着两者之间有任何关系。

如果您想使用宏变量来生成数据步骤的代码,则需要将TODAY替换为&TODAY。

if day(&today) ge 1 and day(&today) le 15 then do;

因此,对于您设置为宏变量TODAY的值,这意味着您试图运行的SAS代码是:

if day(today()) ge 1 and day(today()) le 15 then do;

注意,这实际上不是处理这个问题的好方法,因为它多次调用TODAY()函数。如果数据步骤在午夜之前开始,可能会导致奇怪的结果。因此,IF条件可能在31号运行,但当您到达ELSE条件时,时钟已拨到下个月的第一天。

最新更新