考虑以下文字值' 2016年1月3日'来自数据集。这是一个格式错误的日期值,我无法使用ANYDTDTE.
更正,因为我在SAS 9.0上。在这个字符串中,日期和月份也是错误的方式。这实际上是date9.
格式的03JAN2016
因此,我试图使用以下宏来纠正以上所有内容:
%macro date_cats();
proc sql noprint;
select scan(matchdate,1,'/'), scan(matchdate,2,'/'), strip(scan(matchdate,3,'/')) into :month, :day, :year
from test;
quit;
%let padder = 0;
%if %length(&month) < 2 %then
%let month = %sysfunc(cats(&padder., &month.));
%put &month.;
%if %length(&day) < 2 %then
%let day = %sysfunc(cats(&padder., &day.));
%put &day.;
%put %sysfunc(cats(&day., &month., &year.));
%mend;
%date_cats();
三个%put
语句在日志中生成以下内容:
01
03
132016
任何人都可以在最终的陈述声明中告诉我为什么最终的CATS
声明要么放弃添加的&#39; 0&#39;字符或恢复到填充之前加入的宏变量?
由于
答案 0 :(得分:4)
不要使用CATS()
来生成宏变量。
首先它是完全不需要的,因为您可以通过将它们的值彼此相邻地扩展来连接宏变量值。取代
%let month = %sysfunc(cats(&padder., &month.));
与
%let month = &padder.&month.;
第二次在尝试评估CATS()
等可以采用数字或字符值%SYSFUNC()
的函数的参数时,会尝试评估字符串以查看它们是否为数字。在你的情况下,它们是数字,所以前导零消失。在其他情况下,您可以使SAS生成警告消息。
第三次,如果您真的想要转换字符串,例如M / D / Y&#39;变成像DMY&#39;这样的字符串。然后假设字符串包含有效日期,那么只需使用格式进行转换。
%let have=1/20/2015 ;
%let want=%sysfunc(inputn(&have,mmddyy10),ddmmyyn8);
答案 1 :(得分:0)
CATS正在查看数字并自动转换它们,无益。
通常对于宏变量,您可以使用以下
%put &day.&month.&year.;