Sql 在DB2中通过SAS将CYYMMDD转换为SAS日期
我希望将CYYMMDD格式的日期转换为标准SAS日期,其中20世纪的C为0,21世纪的C为1。该代码将使用“procsql”放在SAS查询中,以便它可以将SAS日期与DB2中存储的日期进行比较 示例:输入数据=1130101,输出=2013年1月1日 我尝试过的例子有: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
(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;