SAS日期转换

时间:2018-05-05 09:51:40

标签: sas

我在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宏来解决,而不是在电话会议中

2 个答案:

答案 0 :(得分:2)

您可以使用

将月份代表 yyyymm 转换为 yyyy-mm-01
  • %sysfunc不需要数据步骤并调用函数inputnputn
  • 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.
                )) ;