通过SAS将DB2中的CYYMMDD转换为SAS Date

时间:2013-02-18 00:32:38

标签: sql db2 sas

我希望将日期格式为CYYMMDD(其中C为20世纪为0或21世纪为1)转换为标准SAS日期。此代码将使用'proc sql'放置在SAS查询内,以便它可以将SAS日期与存储在DB2中的日期进行比较。

示例:输入数据= 1130101,输出='1Jan2013'd

我尝试过的例子是:

(substr(t1.'EffectDate'n,4,2)|| '/' || substr(t1.'EffectDate'n,6,2) || '/' || cast(substr(t1.'EffectDate'n,1,3) AS INTEGER) + 1900)

没有使用cast()函数(看起来它不存在?)

也尝试过:

convert(varchar(10), convert(datetime, right(t1.'EffectDate'n, 6), 12), 101)

但varchar(10)不存在。

我的查询如下:

proc sql;
create table CLAIMS as select
          t1.CID, 
          t1.MID, 
          t1.DOS 
          OTHER_TABLE.ChangeDate AS EffectDate
      FROM
        SOURCE.REJECTED t1
      INNER JOIN
        EGTASK.OTHER_TABLE
      ON
        t1.DOS >= *Converted_Date*
      [... goes on a couple more lines...]

其中* Converted_Date *是我需要的。

(但是,我应该澄清这个特定的查询/连接不一定需要是SQL)

1 个答案:

答案 0 :(得分:2)

要将变量从其当前编码格式转换为适当的SAS日期变量,您需要将其转换为字符串,然后使用INPUT函数读取结果。例如:

data _null_;
  do EffectDate = 1130101,0130101;

     cEffectDate = put(EffectDate,z7.);
     if substr(cEffectDate,1,1) = '0'
         then SASEffectDate = input('19' || substr(cEffectDate,2),yymmdd8.);
         else SASEffectDate = input('20' || substr(cEffectDate,2),yymmdd8.);
     put EffectDate=
       / SASEffectDate=
       / ;
     end;
  format SASEffectDate yymmdd10.;
run;

这只是一个例子而且有点啰嗦;它创建一个名为SASEffectDate的新SAS变量来保留原始变量。一旦将它作为SAS变量,您就不需要做任何其他事情; SAS Access产品将知道如何引用外部数据库。

以下是使用PROC SQL执行类似操作的示例:

data have; /* Just a dummy data set for illustration */
  do EffectDate = 1130101,0130101;
     i+1;
     output;
     end;
run;
proc sql;
   create table want as
   select t2.*
        , case when t2.EffectDate < 999999 /* starts with 0 */
             then input('19' || substr(put(EffectDate,z7.),2),yymmdd8.)
             else input('20' || substr(put(EffectDate,z7.),2),yymmdd8.)
             end as SASEffectDate format=yymmdd10.
    from have t2
    ;
quit;