我想对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个字符。