我有一张表,其中有一些关于门诊患者的基本信息:
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值超出范围。
答案 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;