SAS函数最小值和日期格式问题
SAS function min and date formatting issue
我有一个table,上面有一些关于门诊病人的基本信息:
ID Date
A 10/04/11
B 10/18/11
C 11/30/11
在 SAS 中,当我检查日期列时,我看到它的格式为 MMDDYY8。和信息格式 DATETIME20。对于我需要找到最小日期的另一个步骤:
proc sql;
create table outpatient2 as
select distinct ID, min(Date) as first_date datetime.
from outpatient
group by ID;
quit;
当我检查输出时,它看起来像这样:
ID first_date
A 01JAN60:05:15:05
B 01JAN60:05:15:03
C 01JAN60:05:15:52
因为我没有时间,我不好的解决办法是将门诊病人 table 发送到 oracle 并使用此调用它:
from userid.outpatient
我确实通过在数据步骤中设置它来检查 sas 中的 oracle 版本,它似乎是格式并且都是信息格式 DATETIME20。但是使用周围的错误修复我得到了我正在寻找的正确输出:
ID first_date
A 05OCT11:00:00:00
B 25MAY11:00:00:00
C 09AUG11:00:00:00
请完全忽略日期,它们只是一个随机示例,用于说明当日期格式为 MMDDYY8 时。并且使用了 min(Date),它 returns 是一个奇数日期,但是如果 Date 被格式化为 DATETIME20。它 returns 正确的日期。
编辑:没有空白日期,虽然 outpatient2 步骤完成,但我收到错误:日期值超出范围。
看看是否可以使用 DATEPART 函数从变量中获取日期。还有一个TIMEPART
也是。
ActualDate=datepart(date);
ActualTime=timepart(date);
format actualdate mmddyy8. actualtime time.;
您不能仅使用格式将数据从日期转换为日期时间,您需要使用函数。此外,您的原始数据集中有一个不正确的非正式集,日期时间格式不应应用于日期变量。
下面是一个复制您的问题的示例,以及根据您的数据获得结果的正确方法。
*Generate sample data with properties described in question;
data have;
informat dt_bad datetime20.;
format dt_bad mmddyy8.;
dt_bad=mdy(2, 12, 2014); output;
dt_bad=mdy(3, 13, 2014); output;
dt_bad=mdy(4, 20, 2013); output;
run;
proc print data=have;
run;
*Your code which generates incorrect output;
proc sql;
create table wrong_output as
select min(dt_bad) as bad_date format=datetime20.
from have;
quit;
proc print data=wrong_output;
run;
*one correct way to convert a date variable to datetime variable;
proc sql;
create table correct_output as
select dhms(min(dt_bad), 0, 0, 0) as good_date format=datetime20.
from have;
quit;
proc print data=correct_output;
run;
我有一个table,上面有一些关于门诊病人的基本信息:
ID Date
A 10/04/11
B 10/18/11
C 11/30/11
在 SAS 中,当我检查日期列时,我看到它的格式为 MMDDYY8。和信息格式 DATETIME20。对于我需要找到最小日期的另一个步骤:
proc sql;
create table outpatient2 as
select distinct ID, min(Date) as first_date datetime.
from outpatient
group by ID;
quit;
当我检查输出时,它看起来像这样:
ID first_date
A 01JAN60:05:15:05
B 01JAN60:05:15:03
C 01JAN60:05:15:52
因为我没有时间,我不好的解决办法是将门诊病人 table 发送到 oracle 并使用此调用它:
from userid.outpatient
我确实通过在数据步骤中设置它来检查 sas 中的 oracle 版本,它似乎是格式并且都是信息格式 DATETIME20。但是使用周围的错误修复我得到了我正在寻找的正确输出:
ID first_date
A 05OCT11:00:00:00
B 25MAY11:00:00:00
C 09AUG11:00:00:00
请完全忽略日期,它们只是一个随机示例,用于说明当日期格式为 MMDDYY8 时。并且使用了 min(Date),它 returns 是一个奇数日期,但是如果 Date 被格式化为 DATETIME20。它 returns 正确的日期。
编辑:没有空白日期,虽然 outpatient2 步骤完成,但我收到错误:日期值超出范围。
看看是否可以使用 DATEPART 函数从变量中获取日期。还有一个TIMEPART
也是。
ActualDate=datepart(date);
ActualTime=timepart(date);
format actualdate mmddyy8. actualtime time.;
您不能仅使用格式将数据从日期转换为日期时间,您需要使用函数。此外,您的原始数据集中有一个不正确的非正式集,日期时间格式不应应用于日期变量。
下面是一个复制您的问题的示例,以及根据您的数据获得结果的正确方法。
*Generate sample data with properties described in question;
data have;
informat dt_bad datetime20.;
format dt_bad mmddyy8.;
dt_bad=mdy(2, 12, 2014); output;
dt_bad=mdy(3, 13, 2014); output;
dt_bad=mdy(4, 20, 2013); output;
run;
proc print data=have;
run;
*Your code which generates incorrect output;
proc sql;
create table wrong_output as
select min(dt_bad) as bad_date format=datetime20.
from have;
quit;
proc print data=wrong_output;
run;
*one correct way to convert a date variable to datetime variable;
proc sql;
create table correct_output as
select dhms(min(dt_bad), 0, 0, 0) as good_date format=datetime20.
from have;
quit;
proc print data=correct_output;
run;