【发布时间】:2018-02-15 21:21:50
【问题描述】:
下面是我创建宏并传入日期变量的小问题。不使用日期变量,它的结果如下。
%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 01JAN2018 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) 或者传递的日期需要遵守某种格式。我只想替换今天的日期()。你能帮我吗?我是 SAS 新手。
谢谢
【问题讨论】:
-
您在调用宏时希望将哪些值传递给宏?你想传递看起来像日期
16FEB2018的字符串吗?或者您想传入一个有效的 SAS 日期,例如日期文字"16FEB2018"d,还是自 01JAN1960 以来的简单天数? -
我很灵活,因为我是决定传球的人。因为我会这样做,例如%x(2018 年 2 月 16 日); %x(16Jan2018);..等基本上我传递月度数据点来运行月度报告。所以只要 sas 接受我的价值观。
-
因此,如果您传入
16FEB2018之类的值,并且希望将其用作实际日期,则需要将其转换为宏主体中的日期文字。"&mvar"d -
谢谢它的工作。但我想知道 btw %let dts = %sysfunc(today()); 的区别和 %let dts = "%dts1"d (即 "16jan2018"d。两个步骤都指向下面的步骤。%let yymm1 = %sysfunc(intnx(MONTH,&dts,&i));假设今天是 16jan2018,我知道 %let dts = %sysfunc(today()); 解析为 SAS 整数值。但是“16jan2018”D 不是 SAS 整数,对吧?我只是不确定为什么会有不同的处理方式。
-
请参阅下面的答案。您可以将同一日期表示为整数或日期文字。只要确保你知道自己在做什么。