听起来像是在尝试将201,801这样的数字视为2018年的第一个月,然后再增加几个月并使用相同的“风格”生成数字。
如果你想在宏代码中使用数字字符串,你可以像这样创建一个宏:
%macro add_months_macro(date,months); %sysfunc(intnx(month,%sysfunc(inputn(&date.01,yymmdd8)),&months),yymmn6) %mend;
但是你想要一个方法,你可以使用普通SAS语句中的变量值,然后不使用 %sysfunc() 一点都不而只是使用宏来生成SAS代码以直接调用函数。
%sysfunc()
%macro add_months_sas(date,months); input(put(intnx('month',input(cats(&date,'01'),yymmdd8.),&months),yymmn6.),6.) %mend;
那么你的WHERE子句将如下所示:
WHERE %add_months_sas(T1.old_date, T1.x_months) > 201801
的 但你应该只是将数字转换为实际日期,然后使用 INTNX() 功能添加月份。 强> 然后根本不需要宏。
INTNX()
WHERE intnx('month',T1.old_date, T1.x_months) > '01JAN2018'd
如果您运行的是相对较新版本的SAS,则应将其作为FCMP功能而不是宏功能共享。
proc fcmp 允许您创建(并保存)可从datasteps中调用的用户定义函数 proc sql (也可以通过类似的东西 %sysfunc() )。
proc fcmp
proc sql
这是一个例子 fcmp 在指定的两个数字之间返回一个随机数的函数:
fcmp
proc fcmp outlib=work.funcs.funcs; function randbetween(min,max); return ( min + floor( ( 1 + max - min ) * rand("uniform") ) ); endsub; run;
用法示例:
data example; do cnt=1 to 5; x = randbetween(1,100); output; end; run;
结果:
Obs cnt x 1 1 8 2 2 93 3 3 98 4 4 97 5 5 12
如果您收到SAS的任何关于它未能识别您的功能的投诉,您可能需要更新您的选项,其中包括以下内容: options cmplib = (work.funcs);
options cmplib = (work.funcs);