如何解决错误:在表达式 (SAS) 中找不到所需的运算符
我正在尝试从开始日期和结束日期开始循环,如下所示:
错误:
在表达式中找不到所需的运算符:YEAR(INTNX('MONTH',MDY(2,1,2020),3,'SAME'))*100+MONTH(INTNX('MONTH',1),'相同'))
代码:
%LET ENDING_YEAR = 2021;
%LET ENDING_MONTH = 3;
%LET STARTING_YEAR = 2020;
%LET STARTING_MONTH = 2;
DATA COUNT;
START_DATE = MDY(&STARTING_MONTH.,&STARTING_YEAR.);
END_DATE = MDY(&ENDING_MONTH.,&ENDING_YEAR.);
COUNT_MONTH = INTCK('MONTH',START_DATE,END_DATE)+1;
COUNT_MONTH_4 = COUNT_MONTH - 4;
COUNT_MONTH_3 = COUNT_MONTH - 3;
call symputx('NUM_MONTH',COUNT_MONTH);
call symputx('NUM_MONTH_4',COUNT_MONTH_4);
call symputx('NUM_MONTH_3',COUNT_MONTH_3);
RUN;
%MACRO FINAL_DATA;
%DO i = 0 %TO &NUM_MONTH_4.;
%LET ADDITION = %EVAL(&i.+3);
%LET TARGET_DB=INTNX('MONTH',MDY(&STARTING_MONTH.,&STARTING_YEAR.),&ADDITION.,'SAME');
%LET TARGET_DB_MONTH = MONTH(&TARGET_DB.);
%LET TARGET_DB_YEAR = YEAR(&TARGET_DB.);
%LET DB = %EVAL(&TARGET_DB_YEAR.*100+&TARGET_DB_MONTH.);
LIBNAME TETRIS "/actuary/Commercial/Monthend/&DB.";
%LET TARGET_EFF =INTNX('MONTH',&i.,'SAME');
%LET TARGET_EFF_MONTH = MONTH(&TARGET_EFF.);
%LET TARGET_EFF_YEAR = YEAR(&TARGET_EFF.);
%EXTRACTION(INFORCE,&TARGET_EFF_YEAR.,&TARGET_EFF_MONTH.);
%END;
%DO j = &NUM_MONTH_3. %TO &NUM_MONTH.;
%LET DB = %EVAL(&ENDING_YEAR.*100+&ENDING_MONTH.);
LIBNAME TETRIS "/actuary/Commercial/Monthend/&DB.";
%LET TARGET_EFF =INTNX('MONTH',&j.,'SAME');
%LET TARGET_EFF_MONTH = MONTH(&TARGET_EFF.);
%LET TARGET_EFF_YEAR = YEAR(&TARGET_EFF.);
%EXTRACTION(INFORCE,&TARGET_EFF_MONTH.);
%END;
%MEND;
%FINAL_DATA;
我是 SAS 的新手。任何建议将不胜感激。
谢谢。
解决方法
如果要在宏逻辑中调用 YEAR() 或 INTNX() 等 SAS 函数,则每个函数调用都需要使用 %SYSFUNC() 宏函数来调用 SAS 函数。
所以在这个声明中:
%LET DB = %EVAL(&TARGET_DB_YEAR.*100+&TARGET_DB_MONTH.);
因为被引用的宏变量有这样的字符串:
TARGET_DB_YEAR resolves to YEAR(INTNX('MONTH',MDY(2,1,2020),3,'SAME'))
TARGET_DB_MONTH resolves to MONTH(INTNX('MONTH','SAME'))
不是自 1960 年 SAS 用于存储日期值以来的实际天数,而是您要求 %eval()
函数执行它不理解的操作。它只能做简单的整数运算和布尔逻辑。
要遍历一系列月份,只需使用 INTNX() 函数从起始月份开始的偏移量。如果要生成 YYYYMM 数字字符串,只需使用 YYMMN 格式。
所以你可以使用这样的东西:
%let start=%sysfunc(mdy(&starting_month,&starting_year));
%let end=%sysfunc(mdy(&ending_month,&ending_year));
%do offset = 0 %to %sysfunc(intck(month,&start,&end));
%let date=%sysfunc(intnx(month,&offset));
%let db=%sysfunc(putn(&date,yymmn6.));
...
%end;
,
代码缺少在宏逻辑中使用函数所需的 %SYSFUNC()
。
SAS 应该如何知道是否应该是“INTNX”的文本值,或者您是否想将其用作函数?为了区分,除非您另有说明,否则所有内容都被解释为文本。使用 %SYSFUNC() 告诉 SAS 您要使用 SAS 函数。
每个函数都需要包含在 %SYSFUNC() 中,因此对于嵌套函数,您需要多次调用。
另外,当使用宏函数时,您不将参数包含在引号中,因此您需要删除 MONTH 和 SAME 参数周围的引号。
%DO i = 0 %TO &NUM_MONTH_4.;
%LET ADDITION = %EVAL(&i.+3);
%LET TARGET_DB=%sysfunc(INTNX(MONTH,%sysfunc(MDY(&STARTING_MONTH.,&STARTING_YEAR.)),&ADDITION.,S));
%LET TARGET_DB_MONTH = %sysfunc(MONTH(&TARGET_DB.));
%LET TARGET_DB_YEAR = %sysfunc(YEAR(&TARGET_DB.));
%LET DB = %EVAL(&TARGET_DB_YEAR.*100+&TARGET_DB_MONTH.);
LIBNAME TETRIS "/actuary/Commercial/Monthend/&DB.";
%LET TARGET_EFF = %sysfunc(INTNX(MONTH,&i.,S));
%LET TARGET_EFF_MONTH = %sysfunc(MONTH(&TARGET_EFF.));
%LET TARGET_EFF_YEAR = %sysfunc(YEAR(&TARGET_EFF.));
%PUT _ALL_;
%END;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。