我在yymmn6下面有一个宏变量。格式。
%let a=201501;
我希望有一个基于宏a的新宏变量b和'2015-01-01'(teradata格式)。这样我就可以在条件
中调用宏b我尝试了以下代码。
%let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'");
%put &b.
结果:选项NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
错误:未找到宏函数调用后的预期闭括号。
61个
62个
63%让b =%sysfunc(put(& a。,year4。)||' - '|| put(& a,month2。)||' - 01'||“'”);
64%放& b。
65
%let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.);
结果:
%让b =%sysfunc(putn(& a。,yymmn6。),yymmdd10。);
64%放& b。
65个
66选项NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;
251203选项NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK
%let a=201501;
data _null_;
date=input("&a.",yymmn6.);
call symput('date1' , "'"||put(date,year4.)||'-
'||put(date,month02.)||'-01'||"'");
run;
%put &date1.;
对于上述数据 null 我得到的结果是
68%put& date1。; '2015-1-01'
所以iam尝试做的就是将201501转换为2015-01-01,并希望使用%let宏来解决,而不是在电话会议中
答案 0 :(得分:2)
您可以使用
将月份代表 yyyymm 转换为 yyyy-mm-01%sysfunc
不需要数据步骤并调用函数inputn
和putn
inputn
将月份表示转换为sas日期值putn
将sas日期值转换为 yyyy-mm-dd 表示实施例
%let month = 201501;
%let fom_date = %sysfunc(inputn(&month,yymmn6.));
%let fom_ymd = %sysfunc(putn(&fom_date,yymmdd10.));
%put &=month;
%put &=fom_date;
%put &=fom_ymd;
作为一个宏,单引号发出的表示形式,以便成为Teradata日期文字。
%macro ymn_to_tddl (month);
%* emit teradata date literal corresponding to month;
%* month - month representation as yyyymm;
%str(%')%sysfunc(putn(
%sysfunc(inputn(&month,yymmn6.))
,yymmdd10.
))%str(%')
%mend;
%put %ymn_to_tddl (201501);
---- log ----
'2015-01-01'
答案 1 :(得分:0)
你有一些错误。重要的是201501不是SAS日期。 SAS将日期存储为自1960年1月1日以来的天数。对您而言,201501代表2015年1月1日。对于SAS,201501代表2511年9月10日。
在宏语言中,您可以调用INPUTN函数将201501转换为2015年1月1日的SAS日期,然后调用PUTN函数将其转换为您想要的YYYY-MM-DD格式。
%let a=201501 ;
%let a_SASdate=%sysfunc(inputn(&a,yymmn6.)) ;
%let b=%sysfunc(putn(&a_SASdate,yymmdd10.)) ;
%put &=a &=a_SASdate &=b ;
A=201501 A_SASDATE=20089 B=2015-01-01
如果您不介意使用大量括号,则可以在一个语句中完成所有操作:
%let b=%sysfunc(putn(%sysfunc(inputn(&a,yymmn6.))
,yymmdd10.
)) ;