我的问题如下 - 我有一个代码,为宏变量添加一个月,代码工作正常:
%let month=1;
%let act_dt = %sysfunc(MDY(&month,1,2016));
%let x_akt=%sysfunc(intnx(MONTH,&act_dt,1),yymmdd10.);
%put current month: &act_dt;
%put plus one month: &x_akt;
给我输出:
current month: 20454
plus one month: 2016-02-01
但是如果我在第一个宏变量中添加一种格式,那么函数intnx就无法正常工作。
%let month=1;
%let act_dt = %sysfunc(MDY(&month,1,2016),yymmdd10.);
%let x_akt=%sysfunc(intnx(MONTH,&act_dt,1),yymmdd10.);
%put current month: &act_dt;
%put plus one month: &x_akt;
结果:
current month: 2016-01-01
27 %put plus one month: &x_akt;
plus one month: 1965-08-01
感谢您的任何建议,为什么会这样,如果有办法如何以相同的格式呈现两个宏变量。
答案 0 :(得分:1)
你可以看到你的第一个日志给出“当前月份”的大部分原因是20454.这显然不是人类可读的日期。事实上,它是SAS 2016年1月1日的内部代表,表示为自1960年1月1日以来的天数。
您的第一个示例有效,因为它将该数值传递给INTNX()
函数,这是该函数需要和期望的函数。您的第二个示例将字符值'2016-01-01'传递给该函数,SAS尝试通过将其部分转换为数值2016来处理该函数(自1960年1月1日起作为天数)是1965年7月9日然后,INTNX()
函数将此向前移动一个月。
所有SAS日期/时间功能都希望接收数字输入。 SAS中没有单独的日期/时间数据类型,只是应用了特定日期/时间格式的数字。要使用宏变量,您的代码必须将日期值存储和操作为数字,然后仅使用PUT()
函数进行转换以进行显示,或者将它们存储为格式化日期,但始终将它们转换为带有数字的数字将值传递给日期/时间函数时%SYSFUNC(INPUT())
。
在短DATA _NULL_
步骤中进行此类操作通常比使用大量%SYSFUNCS()
的宏代码更清晰。