SAS - 将日期格式添加到宏变量中,从而产生奇怪的结果

时间:2017-02-02 09:39:21

标签: sas sas-macro

我的问题如下 - 我有一个代码,为宏变量添加一个月,代码工作正常:

%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     

感谢您的任何建议,为什么会这样,如果有办法如何以相同的格式呈现两个宏变量。

1 个答案:

答案 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()的宏代码更清晰。