SAS宏变量Numeric,但另一个宏中的字符?

SAS宏变量Numeric,但另一个宏中的字符?,sas,Sas,我想对数字日期进行简单的数学运算,格式为YYYYMM,但当我在另一个宏中运行monthend_add宏时,它会将其更改为character。有人能解释一下吗 /* macro to add months and keep YYYYMM format */ %Macro monthend_add(me, add); %let months = %eval(&me / 100 * 12 + %sysfunc(mod(&me, 100)) + &add - 1);

我想对数字日期进行简单的数学运算,格式为YYYYMM,但当我在另一个宏中运行monthend_add宏时,它会将其更改为character。有人能解释一下吗

/* macro to add months and keep YYYYMM format */
%Macro monthend_add(me, add);
     %let months = %eval(&me / 100 * 12 + %sysfunc(mod(&me, 100)) + &add - 1);
     %eval(&months / 12 * 100 + %sysfunc(mod(&months, 12)) + 1);
%mend monthend_add;

%let me = 201512;
%let me = %monthend_add(&me, 1);
%put me: &me, %datatyp(&me);


%macro now_char;
    %let me = 201512;
    %let me = %monthend_add(&me, 1);
    %put me: &me, %datatyp(&me);
%mend;

%now_char    
在这两种情况下(第一个是全局范围,第二个是内部范围),您都在
monthend\u add
宏中返回分号。要修复此问题,请按如下方式删除:

%Macro monthend_add(me, add);
  %let months = %eval(&me / 100 * 12 + %sysfunc(mod(&me, 100)) + &add - 1);
  %eval(&months / 12 * 100 + %sysfunc(mod(&months, 12)) + 1)
%mend monthend_add; 
在第一个实例中,返回的分号似乎终止了赋值语句。因此
&me=201512
%datatype(201512)=数值

在第二个实例中(在宏中),情况似乎并非如此,因此
&me=201512
%datatyp(201512;)=CHAR

我猜原因是在全局上下文中,宏在赋值完成之前立即执行(因此在第一个分号处终止)

而在第二个(内部宏)上下文中,
monthend\u add
宏在调用
now\u char
之前无法运行-因此当编译
now\u char
时,会预先分配
me
值的空间,然后将返回的分号存储到其中

最后,请记住(技术上)SAS宏变量只存储文本!准确地说是65534个字符