SAS宏变量数字,但是另一个宏中有Char?

时间:2018-07-20 12:48:36

标签: sas

我想对数字日期做简单的数学运算,格式为YYYYMM,但是当我在另一个宏中运行monthend_add宏时,它将其更改为字符。谁能解释一下?

/* 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    

1 个答案:

答案 0 :(得分:2)

在两种情况下(首先是全局范围,其次是内部范围),您都将在monthend_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)=NUMERIC

在第二种情况下(在宏内)似乎并非如此,因此&me=201512;%datatyp(201512;)=CHAR

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

在第二个(内部宏)上下文中,monthend_add宏在调用now_char之前无法运行-因此,在编译now_char时,空格为me被预先分配,然后将返回的分号存储到其中。

最后一点-请记住,(技术上)SAS宏变量只能存储文本!准确地为65,534个字符。