首页 > 解决方案 > SAS 日期转换

问题描述

我有以下带有 yymmn6 的宏变量。格式。

%let a=201501;

我想有一个新的宏变量 b 基于宏 a 和 '2015-01-01'(teradata 格式)。这样我就可以在 where 条件下调用宏 b

我尝试了以下代码。

%let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'");
%put &b.

结果:OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;错误:未找到宏函数调用后预期的右括号。61
62
63 %let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'"); 64%看跌期权。65

   %let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.);

结果:

%let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.); 64%看跌期权。65
66 选项NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;251203 选项注释 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%看跌&date1.; '2015-1-01'

所以我想做的就是将 201501 转换为 2015-01-01 并希望使用不在调用符号中的 %let 宏来解决

标签: sas

解决方案


您可以使用将您的月份表示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);

- - 日志 - -

'2015-01-01'

推荐阅读