1

我正在寻找将 CYYMMDD 格式的日期(其中 C 是 0 代表 20 世纪或 1 代表 21 世纪)为标准 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)

4

1 回答 1

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;  
于 2013-02-18T01:00:47.060 回答