我想对数字日期做简单的数学运算,格式为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
答案 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个字符。