如何检索数据步骤中宏参数集的数值

How do I retrieve numerical value of macro argument set in data step

我在这个问题上转了 1.5 个小时,所以我屈服并在这里寻求帮助。我想做的事情非常简单,但我一辈子都找不到 link 描述过程。

我有以下数据步骤:

data _null_;
    some_date = "01JAN2000"D;
    call symput('macro_input_date',left(put(some_date),date9.)));
    %useful_macro(&macro_input_date);
run;

其中将日期值传递给宏函数(我是新手)。我想使用日期值的数值 - 假设我想获取年份值,将其乘以日期值,然后减去月份值除以 3 后的余数。我可以' 似乎只从输入中得到年份值。我尝试了各种方法,例如

谁能告诉我我错过了什么?

谢谢!

如果您只是想获取年份,您可以这样做:

data _null_;
    some_date = "01JAN2000"D;
    call symput('macro_input_date',left(put(some_date,date9.)));
    yearval = substr(symget('macro_input_date'),6,4);
    put yearval=;
run;

您的宏值 (&macro_input_date) 不是实际日期值 (14610),而是文本 01JAN2000。所以你不能使用 year 函数(除非你 INPUT 它回来了),你会使用 substr 来获取年份部分。

当然,这是毫无意义的,因为 to/from 宏变量在这里并没有真正完成多少。

您只是对日期字面量有疑问吗?您的数据步骤代码

data _null_;
  some_date = "01JAN2000"D;
  call symput('macro_input_date',left(put(some_date),date9.)));
run;

将做与

相同的事情
%let macro_input_date=01JAN2000 ;

现在,如果您想将该字符串视为代表日期,那么您需要将其包装为日期文字

"&macro_input_date"d

或转换。

%sysfunc(inputn(&macro_input_date,date9))

为什么不直接将实际日期值存储到宏变量中?

call symputx('macro_input_date',some_date);

那么它对您来说看起来不像一个日期,但对 YEAR() 函数来说它看起来像一个日期。

鉴于您询问了宏函数,我猜您的示例日期处理只是一个示例。谈到一般的宏函数,重要的是要理解宏函数(通常)不会做任何自己的处理,它只会生成一些数据步骤代码来完成一些任务。因此,对于像您人为设计的示例,数据步骤代码将类似于:

data out;
  set in; * Assume this contains a numeric called 'some_date';
  result = year(some_date) * day(some_date) - mod(month(some_date), 3);
run;

要宏化这个,你不需要将数据值传输到宏,你只需要传输变量名:

%macro date_func(var=);
  year(&var) * day(&var) - mod(month(&var), 3)
%mend;

data out;
  set in; * Assume this contains a numeric called 'some_date';
  result = %date_func(var=some_date);
run;

注意这里var参数的值是字面文本some_date不是some_date数据步的值多变的。当然还有其他方法可以做到这一点——你实际上可以给这个宏传递一个日期文字,它仍然有效:

data out;
  set in; * Assume this contains a numeric called 'some_date';
  result = %date_func(var="21apr2017"d);
run;

所以这完全取决于你想做什么......也许你想将结果分配给另一个宏变量,所以它根本不需要成为数据步骤的一部分,在在这种情况下,您可以使用 %sysfunc 函数等做类似的事情