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;