以下代码的要点是将上周星期日的日期和上周星期六的日期分配给宏变量。我需要 date9。格式。
在第48行的数据步骤中,我将它们格式化为 date9。,但是在数据步骤之外调用它们时会丢失格式。它们只是显示为默认的SAS日期格式。
我在这里缺少什么?
44 data _null_;
45 curDate= today();
46 sunday = intnx('week1.1',curDate,-1,'Begin');
47 saturday = intnx('week1.1',curDate,-1,'End');
48 format _all_ date9.;
49 put (_all_)(=/);
50 call symput('sunday',sunday);
51 call symput('saturday',saturday);
52
53 run;
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
50:23 51:25
curDate=23JUN2016
sunday=12JUN2016
saturday=18JUN2016
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
54 %PUT &sunday;
20617
答案 0 :(得分:1)
您可以使用PUT直接应用格式。您可能会发现在将来的查询中使用实际日期值更容易,如果您正在使用date9格式化,请确保在解析变量后引用并使用d。
我还建议改用呼叫symputX。
call symputx('sunday',put(sunday, date9.));
答案 1 :(得分:1)
这是一种常见的情况,可能会变得很烦人......我编写了一个宏例程,允许使用我们选择的sas格式将格式化(或未格式化)的日期分配给宏变量。
使用%letdate
宏,您只需这样做:
%letdate(sunday, intnx('week1.1',today(),-1,'Begin'), date9.)
%letdate(saturday, intnx('week1.1',today(),-1,'End'), date9.)
日志显示:
*** Variable macro sunday = 12JUN2016 ***
*** Variable macro saturday = 18JUN2016 ***
source code for the macro can be found here;它用法语记录,但应该足够直截了当。请注意:
答案 2 :(得分:0)
Reeza的答案(不同的代码)的替代方案,你可以在%sysfunc中包装put函数,以你想要的格式输出你的宏日期变量;
%put %sysfunc(PutN(&sunday, date9));