微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误:在表达式 (SAS) 中找不到所需的运算符

如何解决错误:在表达式 (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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?