2016-12-14 102 views
0

我在下面的代码中试图转换压缩函数。SAS日期宏和压缩函数

旧代码:(此代码的工作,并返回以下结果)

data _null_; 
%let startdt='2015/11/1'; 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

此代码为宏变量startdt如2015年11月1日和datenum如2015年11月1日返回值。

我正在尝试使用宏变量进行日期类似的功能。

新的代码:(此代码给我一个错误,我无法弄清楚为什么)

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

当我运行这个新的代码,我得到一个错误。我想要得到像旧代码一样的结果。 请帮忙。谢谢!

+0

移动你的'%LET'和'%PUT'语句在数据步之前或之后,因为那是SAS要评估它们时,它使您的代码更易于阅读和理解。将它们留在数据步骤的中间使得它看起来像是在数据步骤运行时如何进行评估,这是不正确的。这是否解决了您的问题? – Tom

+0

嗨,这不能解决问题。错误出现在没有let语句的“新代码”中。谢谢! – PJay

+0

您的第二个数据步骤也应该运行良好,但您需要将'%PUT'语句移至'run;'语句之后。否则,它们会产生一个错误,即宏变量不存在,或者更糟糕的是,它们会向您显示它们在数据步骤运行之前所具有的值。 – Tom

回答

0

您的第一个数据步骤是从宏变量中删除引号。您可以通过使用%sysfunc()调用compress()函数在宏代码中执行此操作。甚至只是使用%scan()函数。

%let date_num = %scan(&startdt,1,%str(%')); 

在第二个它看起来像你试图在日期值上使用INTNX()函数。但是你的宏变量不包含日期值。如果你想把'2015/11/1'视为一个日期,那么你将需要使用一个输入函数来首先进行转换。

%let last_mth_beg = %sysfunc(intnx(month,%sysfunc(inputn(&date_num,yymmdd10)),-1,b),yymmdd10); 
+0

我添加了旧代码仅供参考,因为这是我试图通过避免日期的硬编码实现的结果。我尝试过使用上面的语句,但是我现在正在获取缺少的值。谢谢! – PJay

+0

代码正常工作。假设你的宏变量STARTDT的YYYY/MM/DD格式带有单引号。它将以YYYY/MM/DD格式生成新的宏变量LAST_MTH_BEG,但不包含它的单引号。 – Tom

0

我不知道为什么你的旧代码没有给你一个错误。第一次运行它时,您应该看到错误

警告:表面符号引用DATE_NUM未解析。

然后,数据步骤运行后,&DATE_NUM将有一个值。在数据步骤中不能使用%PUT来显示您在数据步骤中创建的宏变量。

在第二组代码中,您创建的STARTDT宏变量的值首先没有单引号。如果你只是运行以下,你会得到正确的结果:

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
run; 

%put &startdt; 

当我运行它,我看到

2016年11月1日