我希望将日期格式为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)
答案 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;