将日期变量传递给宏以进行 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);
下面是我创建宏并传入日期变量的小问题。在不使用日期变量的情况下,它的工作结果如下。
%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);