【问题标题】:SAS function min and date formatting issueSAS 函数最小值和日期格式问题
【发布时间】:2015-03-20 17:25:27
【问题描述】:

我有一个表格,其中包含一些名为门诊患者的基本信息:

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

因为我没有时间,我的错误解决方法是将门诊表发送到 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 步骤已完成,但我收到一个错误:日期值超出范围。

【问题讨论】:

  • 如果您有日期时间和 mmddyy8 格式的信息,则您的源数据表示不正确。你说你修好了,但没有修好,很难说哪里出了问题。您的信息/格式需要与日期时间/日期相匹配,即。非正式的日期时间需要日期时间格式,而日期信息需要日期格式。
  • 抱歉,但是当我提到围绕它的错误修复时,实际上是将其发送到 oracle 并调用转到 oracle 的表。我猜我需要将其格式化为 DATETIME20。也一样?

标签: oracle date sas proc-sql


【解决方案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;

【讨论】:

  • 非常感谢!我将使用它来检查我的问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多