2013-02-18 58 views
1

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

实施例:我试图输入数据= 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) 

失败到铸造()函数(显示为它不存在?)

也试过:

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)

+0

首先,没有必要包围单引号和'N'预选赛SAS变量名; 'EffectDate'就好了。它是什么类型的变量(字符或数字)? – BellevueBob 2013-02-18 00:39:49

+0

这些报价是从玩游戏中剩余的 - 这只是在那个声明中。该变量是数字。它是格式为“Example”中列出的输入数据 – 2013-02-18 00:45:23

+0

对不起,这是如此复杂,但两个LIBREFS“SOURCE”和“EGTASK”是指什么?它们是不同的DB2连接还是一个SAS库? – BellevueBob 2013-02-18 01:43:34

回答

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; 
+0

有趣。整合到JOIN语句中(在ON标准中)究竟如何?此外,正在运行的代码不是SAS,它是通过从外部数据源提取的“proc sql”执行的SQL。 – 2013-02-18 01:04:15

+0

我想我很困惑。 EffectDate是DB2表中的一列还是SAS数据集中的变量? – BellevueBob 2013-02-18 01:11:20

+0

EffectDate是我DB2表中的一列。 – 2013-02-18 01:14:08