SAS 日期时间过程 SQL
SAS Datetime Proc SQL
你好,我想知道你如何在 PROC SQL
和我在下面写的 data step
中编写这段代码。我正在尝试减少代码,不幸的是,数据最初位于文本文件中,更改为 CHAR
(导入向导)时的日期时间长度为 9 vs 8(计算列),这是默认值,因此为什么我在第一个数据步骤中更改它。我最终得到了我想要的结果,但我想看看 SQL 是否可以提供更有效的解决方案。
data WORK.CNE_RESI;
SET WORK.cneres_41;
FORMAT RPTDATE_2 $CHAR9.;
IF rptdate = '1/5/2015' THEN RPTDATE_2 = '1/9/2015';
ELSE IF RPTDATE_2 = "" THEN RPTDATE_2=rptdate ;
RUN;
data WORK.CNE_RESI_2;
SET WORK.CNE_RESI;
FORMAT RPTDATE_3 MMDDYY10.;
RPTDATE = input(RPTDATE_2, MMDDYY10.);
RUN;
不确定这是否是正确的方法,但我试过了。
%let olddate = 1/5/2015;
%let newdate = 1/9/2015;
proc sql;
create table WORK.CNE_RESI_2 as
select a.*,
case when rptdate = "&olddate" then "&newdate"
else rptdate
end as RPTDATE_2 format=$char9.,
input(case when rptdate = "&olddate" then "&newdate"
else rptdate
end,mmddyy10.) as RPTDATE_3 format=mmddyy10.
from WORK.cneres_41 a;
quit;
当然,如果您实际上并不需要变量 rptdate_2 并且只是使用它来更改格式,那么这应该可行。
proc sql;
create table WORK.CNE_RESI_2 as
select a.*,
input(case when rptdate = "&olddate" then "&newdate"
else rptdate
end,mmddyy10.) as RPTDATE_3 format=mmddyy10.
from WORK.cneres_41 a;
quit;
你的最终问题是:
I eventually get the results I want but I would like to see if SQL
could provide a more efficient solution.
您的 DATA 步骤看起来效率低下的原因是您对数据进行了两次完整的传递。在这种情况下没有理由这样做,对于您的示例,单个 DATA 步骤可能至少与 SQL 一样有效。此外,将 format
语句放在 set
语句之上将重新定义 rptdate
的长度,而无需中间变量。考虑到这些想法,您的两个数据步骤可以更有效地写成:
data WORK.CNE_RESI;
format rptdate $char10. rptdate_n mmddyy10.;
set WORK.cneres_41;
if rptdate = '1/05/2015' then rptdate = '1/09/2015';
rptdate_n = input(rptdate, ?? MMDDYY10.);
run;
你好,我想知道你如何在 PROC SQL
和我在下面写的 data step
中编写这段代码。我正在尝试减少代码,不幸的是,数据最初位于文本文件中,更改为 CHAR
(导入向导)时的日期时间长度为 9 vs 8(计算列),这是默认值,因此为什么我在第一个数据步骤中更改它。我最终得到了我想要的结果,但我想看看 SQL 是否可以提供更有效的解决方案。
data WORK.CNE_RESI;
SET WORK.cneres_41;
FORMAT RPTDATE_2 $CHAR9.;
IF rptdate = '1/5/2015' THEN RPTDATE_2 = '1/9/2015';
ELSE IF RPTDATE_2 = "" THEN RPTDATE_2=rptdate ;
RUN;
data WORK.CNE_RESI_2;
SET WORK.CNE_RESI;
FORMAT RPTDATE_3 MMDDYY10.;
RPTDATE = input(RPTDATE_2, MMDDYY10.);
RUN;
不确定这是否是正确的方法,但我试过了。
%let olddate = 1/5/2015;
%let newdate = 1/9/2015;
proc sql;
create table WORK.CNE_RESI_2 as
select a.*,
case when rptdate = "&olddate" then "&newdate"
else rptdate
end as RPTDATE_2 format=$char9.,
input(case when rptdate = "&olddate" then "&newdate"
else rptdate
end,mmddyy10.) as RPTDATE_3 format=mmddyy10.
from WORK.cneres_41 a;
quit;
当然,如果您实际上并不需要变量 rptdate_2 并且只是使用它来更改格式,那么这应该可行。
proc sql;
create table WORK.CNE_RESI_2 as
select a.*,
input(case when rptdate = "&olddate" then "&newdate"
else rptdate
end,mmddyy10.) as RPTDATE_3 format=mmddyy10.
from WORK.cneres_41 a;
quit;
你的最终问题是:
I eventually get the results I want but I would like to see if SQL could provide a more efficient solution.
您的 DATA 步骤看起来效率低下的原因是您对数据进行了两次完整的传递。在这种情况下没有理由这样做,对于您的示例,单个 DATA 步骤可能至少与 SQL 一样有效。此外,将 format
语句放在 set
语句之上将重新定义 rptdate
的长度,而无需中间变量。考虑到这些想法,您的两个数据步骤可以更有效地写成:
data WORK.CNE_RESI;
format rptdate $char10. rptdate_n mmddyy10.;
set WORK.cneres_41;
if rptdate = '1/05/2015' then rptdate = '1/09/2015';
rptdate_n = input(rptdate, ?? MMDDYY10.);
run;