Sql 在DB2中通过SAS将CYYMMDD转换为SAS日期

Sql 在DB2中通过SAS将CYYMMDD转换为SAS日期,sql,db2,sas,Sql,Db2,Sas,我希望将CYYMMDD格式的日期转换为标准SAS日期,其中20世纪的C为0,21世纪的C为1。该代码将使用“procsql”放在SAS查询中,以便它可以将SAS日期与DB2中存储的日期进行比较 示例:输入数据=1130101,输出=2013年1月1日 我尝试过的例子有: (substr(t1.'EffectDate'n,4,2)|| '/' || substr(t1.'EffectDate'n,6,2) || '/' || cast(substr(t1.'EffectDate'n,1,3) AS

我希望将CYYMMDD格式的日期转换为标准SAS日期,其中20世纪的C为0,21世纪的C为1。该代码将使用“procsql”放在SAS查询中,以便它可以将SAS日期与DB2中存储的日期进行比较

示例:输入数据=1130101,输出=2013年1月1日

我尝试过的例子有:

(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)
但是varchar10并不存在

我的查询如下所示:

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...]
我需要的是*转换日期*


但是,我应该澄清,这个特定的查询/连接不一定需要是SQL。要将变量从当前编码格式转换为正确的SAS日期变量,需要将其转换为字符串,然后使用输入函数读取结果。例如:

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;
这只是一个说明,有点冗长;它创建一个名为sasfectdate的新SAS变量以保留原始变量。一旦将其作为SAS变量,就不需要做任何其他事情;SAS Access产品将知道如何引用外部数据库

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


首先,不需要用单引号和n限定符包围SAS变量名;日期很好。它是什么类型的变量?是字符还是数字?引号是在玩游戏时留下的-它只与该语句中的一样。该变量是数值型的。它采用示例中列出的输入数据格式抱歉,这太复杂了,但是两个LIBREFS SOURCE和EGTASK指的是什么?它们是不同的DB2连接还是一个SAS库?EGTASK只是一个存储临时表的地方,例如参考Enterprise Guide,一个SAS GUI程序。在本例中,源代码不是一个外部引用,很抱歉-它是一个SAS库,我在最初的问题中指出,这一切不一定都是SQL-这是我最初没有记住的。我现在得到以下错误:错误:使用大于或等于>=的表达式具有不同数据类型的组件。错误:在贡献表中未找到以下列:SASEffectDate。好的,请查看我的更新答案。它向您展示了如何在CASE表达式中操作这些变量。只需修改它,在主SQL中生成一个派生表,即内部联接选择。。。。注意,您现在说您的问题是100%的SAS,根本不涉及DB2。如何将其集成到ON条件中的JOIN语句中?另外,正在运行的代码不是SAS,而是通过“proc-SQL”从外部数据源提取的SQL。我想我很困惑。EffectDate是DB2表中的一列还是SAS数据集中的一个变量?EffectDate是我的DB2表中的一列;您能否更改您的问题并显示您试图运行的查询类型?听起来您需要在本机DB2代码中使用PROC SQL pass-through执行此操作,对吗?请不要忘记将聊天结果移动到下一代的答案中:
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;