4

我想创建一个 SAS 宏,它以文字日期(例如'31may2011'd)作为参数。在宏内部,我想将其转换为 SAS 日期值(例如 18778)。

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = ???;  /* how to calculate this value ? */  
%mend;  
%transLiteralDate2Value(literal='31may2011'd);

是优雅的方式来实现这一点吗?当然我可以通过解析文字字符串来做到这一点,但我认为必须有更好的方法。

我使用 SAS 9.1.3

4

3 回答 3

3

这将在宏内部或外部工作。不要忘记 %sysfunc() 有一个方便的可选第二个参数,它可以让您格式化输出值。

%let report_date = %sysfunc(sum('01JAN2011'd),best.);

或者

%let report_date = %sysfunc(putn('01JAN2011'd,best.));

干杯抢

于 2011-04-25T23:05:08.290 回答
2

您可以使用 %sysfunc 宏函数来完成。

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);
于 2011-04-21T08:43:37.817 回答
2

有一对像我下面这样的简单转换宏很方便。另请参阅我的 sas-l 张贴

%macro date2num(date, informat=anydtdte.);
  %*-- strip quotations and postfix d from date literal if any. --*;
  %*-- quotations are intentionally doubled to prevent unmatched error --*;
  %let date=%sysfunc(prxchange(s/[''""]d?//i,-1,&date));
  %sysfunc(inputn(&date,&informat))
%mend  date2num;

%macro num2date(num, format=date10., literal=1);
  %local n;
  %let n = %sysfunc(putn(&num,&format));
  %if &literal %then "&n"d; %else &n;
%mend  num2date;
于 2011-04-22T18:48:23.653 回答