SAS - 将日期格式添加到宏变量给出奇怪的结果

SAS - adding date format to the macro variable giving strange results

我的问题如下- 我有一个代码将一个月添加到宏变量并且代码工作正常:

%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     

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

您可以看到第一个日志将 'current month' 显示为 20454 的大部分原因。这显然不是 human-readable 日期。事实上,它是 SAS 对 2016 年 1 月 1 日日期的内部表示,表示为自 1960 年 1 月 1 日以来的天数。

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

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

在简短的 DATA _NULL_ 步中进行这种操作通常比使用大量充满 %SYSFUNCS().

的宏代码更清晰