在 SAS E-Guide 中格式化 &macro 变量日期

Formatting a &macro variable date in SAS E-Guide

下面代码的重点是将前一周星期日的日期和前一周星期六的日期赋值给一个宏变量。我需要 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

您可以使用 PUT 直接应用格式。您可能会发现在以后的查询中使用实际日期值更容易,如果您使用的是 date9 格式,请确保在解析变量时引用并使用 d。

我还建议改用 call symputX。

call symputx('sunday',put(sunday, date9.));

Reeza 答案的替代方法(不同的代码),您可以将 put 函数包装在 %sysfunc 中,以您想要的格式输出宏日期变量;

%put %sysfunc(PutN(&sunday, date9));

Results

这是一种常见的情况,可能会变得非常烦人...我编写了一个宏例程,允许使用我们选择的 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;它以法语记录,但应该足够简单。请注意:

  1. 参数1为宏变量名
  2. 参数 2 是值(就像您在数据步骤中写入的那样)
  3. 参数 3 是您要应用于参数 2 值的 sas 格式。