SAS宏变量数值但字符在另一个宏中

  • 本文关键字:另一个 字符 变量 SAS sas
  • 更新时间 :
  • 英文 :


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

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

在第一个实例中,返回的分号似乎终止了您的赋值语句。因此CCD_ 2和CCD_。

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

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

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

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

相关内容

最新更新