sas输入写入为yyyymmdd的宏日期

sas输入写入为yyyymmdd的宏日期,sas,sas-macro,Sas,Sas Macro,以下是我如何输入和使用日期作为宏变量: %let x = %SYSEVALF('01jan2012'd); %put &x; *see the date as sas sees it; %put %SYSFUNC(putn(&x,yymmn.)); *see the date as yyyymm; 这很好,但我已经厌倦了将日期输入为'2012年1月1日。在特殊情况下,我可能希望将日期作为宏变量y传递,其中y的格式为yyyymmdd,如下所示: %let y = 20120101

以下是我如何输入和使用日期作为宏变量:

%let x = %SYSEVALF('01jan2012'd);
%put &x; *see the date as sas sees it;
%put %SYSFUNC(putn(&x,yymmn.)); *see the date as yyyymm;
这很好,但我已经厌倦了将日期输入为
'2012年1月1日
。在特殊情况下,我可能希望将日期作为宏变量
y
传递,其中
y
的格式为
yyyymmdd
,如下所示:

%let y = 20120101;
%let x = %SYSEVALF(&y);

当然,这是行不通的。因此,给定
y
,我应该使用什么来代替
%let x=%SYSEVALF(&y)
x
作为sas查看日期时的日期宏变量?

首先:如果手动输入日期,请使用sas约定。将其输入为'2012年1月1日'd。例如,它的可读性比YYYYMMDD值更快,不管怎样,它都是其他SAS程序员所期望的

第二:在这两种情况下我都不会使用%SYSEVALF()让x='2012年1月1日;在几乎所有的情况下都是足够的,如果不是这样,那么你就以一种不那么有效或标准的方式做了一些事情。除非您打算在文本中的某个地方使用18993(在这种情况下,好的,您可以使用这个)'01JAN2012'd是将其存储在宏变量中的正确方法-让SAS稍后将其转换为18993

最后:

%let y=20120101;
%let x=%sysfunc(inputn(&y,YYMMDD8.));
这是实现你要求的最简单的方法

data _null_;
    Call Symput('NAME',put(today()-1,yymmdd10.));
run;
您只需通过将名称更改为宏名称来重命名代码,并像往常一样通过&NAME调用它即可

我希望这能有所帮助——或者简单地在表格中输入一个日期

input(put(DATE,8.), yymmdd8.) AS DATENAME format=ddMMYY10.

按原样运行该代码块会导致“错误:检测到Open code语句递归”。听起来您遗漏了一个分号,可能在第一行之后。这段代码在我的机器上运行得很好。嗯,我不认为我错过了它,但在重新启动SAS时,一切都正常。OSR本质上只有在为宏变量赋值和使用之间错过分号时才会出现。它需要某种类型的语句,如“%let x=…stuff…&x…”;这在缺少分号时最常见。@zkurtz该错误可能是由于在您提交Joe的代码之前,您的SAS会话中已经提交了某些内容造成的。这也解释了为什么重启修复了它。