SAS功能最小和日期格式问题

时间:2015-03-20 17:25:27

标签: oracle date sas proc-sql

我有一张表,其中有一些关于门诊患者的基本信息:

ID   Date
A    10/04/11
B    10/18/11
C    11/30/11

在SAS中检查Date列时,我看到它的格式为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

因为我没有时间,所以我的错误解决方法是将门诊表发送到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),它返回奇数日期,但是如果Date格式化为DATETIME20。它返回正确的日期。

编辑:没有空白DATE,虽然outpatient2步骤完成,但我得到一个ERROR:Date值超出范围。

2 个答案:

答案 0 :(得分:1)

查看是否可以使用DATEPART功能从变量中获取日期。还有一个TIMEPART

ActualDate=datepart(date);
ActualTime=timepart(date);
format actualdate mmddyy8. actualtime time.;

答案 1 :(得分:1)

您无法仅使用格式将数据从日期转换为日期时间,您需要使用函数。此外,原始数据集中的非正式设置不正确,日期时间格式不适用于日期变量。

以下是复制问题的示例以及根据您的数据获取结果的正确方法。

*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;