在宏中将文字日期参数转换为SAS日期值
我想创建一个SAS宏,它以文字日期(例如“2011年5月31日”d)作为参数。在宏中,我想将其转换为SAS日期值(例如18778) 实现这一目标的方法是否优雅?当然,我可以通过解析文本字符串来做到这一点,但我认为一定有更好的方法在宏中将文字日期参数转换为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 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.));