我已经在这个圈子里走了1.5个小时,所以我在这里请求帮助。我想要做的就是死的简单,但我不能在我的生活中找到描述这个过程的链接。
我有以下数据步骤:
data _null_;
some_date = "01JAN2000"D;
call symput('macro_input_date',left(put(some_date),date9.)));
%useful_macro(¯o_input_date);
run;
其中日期值传递给宏函数(我是这些新手)。我想使用日期值的数值 - 让我们狂野地说我希望得到年份的值,将它乘以日值,并在将月值除以3之后减去余数。我可以似乎只从输入中获得年份值。我尝试过各种各样的事情,比如
symget
,两者都是“裸体”,前面带有“%”,其参数代表以下变体的所有可能的排列:
%sysfunc(year(<argument as variously specified above>)
有谁能告诉我我错过了什么?
谢谢!
答案 0 :(得分:1)
鉴于您询问了宏函数,我猜您的示例日期处理只是一个示例。一般来说,讨论宏函数时,重要的是要理解宏函数(通常)不会对它自己进行任何处理,它只会生成一些数据步骤代码来完成某项任务。因此,对于像您设想的示例,数据步骤代码将类似于:
%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
所以这完全取决于你想要做什么...也许你想将结果分配给另一个宏变量,所以它根本不需要成为数据步骤的一部分,在这种情况下你可以用{{1}}函数等做类似的事情。
答案 1 :(得分:0)
如果你只是想获得这一年,你会做类似的事情:
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;
您的宏值(¯o_input_date
)不是实际日期值(14610),而是文本01JAN2000
。因此,您无法使用year
函数(除非您INPUT
返回),您可以使用substr
来获取年份部分。
当然,这是毫无意义的,因为来往/来自宏变量在这里并没有真正完成。
答案 2 :(得分:0)
你是否只是遇到日期文字问题?您的数据步骤代码
data _null_;
some_date = "01JAN2000"D;
call symput('macro_input_date',left(put(some_date),date9.)));
run;
只会做与
相同的事情%let macro_input_date=01JAN2000 ;
现在,如果您想将该字符串视为表示日期,那么您需要将其包装为日期文字
"¯o_input_date"d
或转换它。
%sysfunc(inputn(¯o_input_date,date9))
为什么不将实际日期值存储到宏变量中?
call symputx('macro_input_date',some_date);
然后它看起来不像你的日期,但它看起来像是YEAR()函数的日期。