我想创建一个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
答案 0 :(得分:3)
这将在宏内部或外部工作。不要忘记%sysfunc()有一个方便的可选第二个参数,可以让你格式化输出值。
%let report_date = %sysfunc(sum('01JAN2011'd),best.);
或
%let report_date = %sysfunc(putn('01JAN2011'd,best.));
干杯 罗布
答案 1 :(得分:2)
您可以使用%sysfunc宏功能执行此操作。
%macro transLiteralDate2Value(literal=);
%put literal = &literal.;
%put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);
答案 2 :(得分:2)
在我的下面有一对简单的转换宏很方便。另请参阅my sas-l posting。
%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;