在宏中将文字日期参数转换为SAS日期值

在宏中将文字日期参数转换为SAS日期值,sas,sas-macro,Sas,Sas Macro,我想创建一个SAS宏,它以文字日期(例如“2011年5月31日”d)作为参数。在宏中,我想将其转换为SAS日期值(例如18778) 实现这一目标的方法是否优雅?当然,我可以通过解析文本字符串来做到这一点,但我认为一定有更好的方法 我使用SAS 9.1.3您可以使用%sysfunc宏函数来完成 %macro transLiteralDate2Value(literal=); %put literal = &literal.; %put sasdatavalue = %sys

我想创建一个SAS宏,它以文字日期(例如“2011年5月31日”d)作为参数。在宏中,我想将其转换为SAS日期值(例如18778)

实现这一目标的方法是否优雅?当然,我可以通过解析文本字符串来做到这一点,但我认为一定有更好的方法


我使用SAS 9.1.3

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

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);

有一对像下面我这样的简单转换宏是很方便的。另见


这将在宏内部或外部工作。别忘了%sysfunc()有一个方便的可选第二个参数,可用于格式化输出值

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

干杯
Rob

我还建议不需要将其包装在宏调用中,因为它是一个简单的单行语句。或者。。。正如我上面建议的那样。您可以学习%sysfunc和intnx函数。当你从一个工作转移到另一个工作或处理其他人的代码时,像这样的宏对你没有帮助,所以我认为最好避免使用它们。另外,如果每个人都有自己的简单函数的宏包装器,那么无论如何,你永远也记不住所有的宏名称。
%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;
%let report_date = %sysfunc(sum('01JAN2011'd),best.);
%let report_date = %sysfunc(putn('01JAN2011'd,best.));