将日期变量传递给宏以进行 sysfunc 处理

passing date variable to macro for sysfunc processing

下面是我创建宏并传入日期变量的小问题。在不使用日期变量的情况下,它的工作结果如下。

%macro x();
%let i=-1;
%let dts = %sysfunc(today());
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x();

日志: 21231 21185 2018年1月1日 2018 年 1 月 31 日

现在我围绕它创建了一个宏并得到了以下错误:

%macro x(dts1);

%let i=-1;
/*%let dts = %sysfunc(today());*/
%let dts = %sysfunc(&dts1);
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x(16JAN2018);

错误:%SYSFUNC 或 %QSYSFUNC 宏函数引用中缺少函数名称。 2018 年 1 月) 错误:未找到宏函数调用后预期的右括号。 )) 错误:未找到宏函数调用后预期的右括号。 错误:未找到宏函数调用后预期的右括号。 ,B),date9.) ,E),date9.)

我不确定如何让 SAS 将传入的日期视为可识别的日期。我知道我可能错误地使用了 sysfunc(&dts) 或者传递的日期需要遵守特定格式。我只想用日期替换 today()。你能帮我吗?我是SAS新手。

谢谢

" 包裹日期并以 d 结尾。这将告诉 SAS 将字符串转换为日期:

%macro x(dts1);

%let i=-1;
/*%let dts = %sysfunc(today());*/
%let dts = "&dts1"d; /*Change here!*/
%put &dts; /*ok*/
%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));
%put &yymm1; /*ok*/

%let mth_beg = %sysfunc(intnx(MONTH,&dts,&i,B),date9.);
%let mth_end = %sysfunc(intnx(MONTH,&dts,&i,E),date9.);
%put &mth_beg &mth_end; /*01JAN2018 31JAN2018*/
/*** proc sql code below ** */
%mend;
%x(16JAN2018);

更改 %let dts = %sysfunc(&dts1);至

%let dts = %sysfunc(inputn(&dts1,date9. ));

SAS 将日期存储为自 1960 年 1 月 1 日以来的天数。因此,如果您不将日期格式附加到日期值,它看起来就像一个整数。

%let today=%sysfunc(today());

然后您可以在任何需要使用日期值的地方使用该整数。

%let next_month=%sysfunc(intnx(month,&today,1,b));

您还可以使用日期文字表示日期。要制作日期文字,您可以使用 DATE 信息格式可以读取的内容(例如 16FEB2018、16feb18、16-FEB-2018 等)来表示日期值,并用引号括起来并附加字母 d

%let today="%sysfunc(today(),date9)"d ;
%let date_string=13FEB2018;
%let date_value="&date_string"d ;

所以日期文字将在 SAS 代码中工作,当您使用 %sysfunc() 宏函数调用 SAS 函数(如 INTNX)时,它们将在 %sysevalf() 宏函数中工作。但是 %eval() 宏函数将无法识别日期文字。因此,如果您想在宏逻辑中使用算术或日期文字比较,则需要使用 %sysevalf()

%if %sysevalf(&today > '01JAN2018'd) %then ....
%let tomorrow=%sysevalf(&today +1);