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

SAS-将日期格式添加到宏变量,产生奇怪的结果,sas,sas-macro,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 pl

我的问题如下- 我有一个向宏变量添加一个月的代码,代码运行良好:

%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     

感谢您的建议,为什么会这样,以及是否有办法以相同的格式显示两个宏变量

您可以看到第一个日志显示“当前月份”为20454的大部分原因。这显然不是一个人类可读的日期。事实上,这是SAS对2016年1月1日的内部表示,表示为自1960年1月1日以来的天数

您的第一个示例之所以有效,是因为它将该数值传递给
INTNX()
函数,这正是该函数所需要和期望的。第二个示例将字符值“2016-01-01”传递给函数,SAS尝试通过将其部分转换为数字值2016来处理该函数,数字值2016(从1960年1月1日起的天数)为1965年7月9日。然后,
INTNX()
函数将其向前移动一个月

所有SAS日期/时间函数都希望接收数字输入。SAS中没有单独的日期/时间数据类型,只有应用了特定日期/时间格式的数字。要在宏变量中工作,代码必须将日期值存储和操作为数字,然后仅使用用于显示的
PUT()
函数对其进行转换,或者将其存储为格式化日期,但在将值传递给日期/时间函数时,始终使用
%SYSFUNC(INPUT())
将其转换回数字

在一个较短的
数据\u NULL
步骤中执行此类操作通常比在大量宏代码中充满
%SYSFUNCS()
更为清晰