【问题标题】:DateTime trouble in SASSAS中的日期时间问题
【发布时间】:2013-10-28 08:07:15
【问题描述】:

我有一个大数据库。那里有合同开始日期。问题是,在前一段时间,有几个值被导入为日期时间格式,而其余的只是 date9。结果现在一些 sql 查询或数据查询由于看到存储在合同开始日期之后的“数字”的不同而显示出奇怪的结果。

当我想获得max(contract_start_date)(例如通过sql)时,我将获得***************,而不是正常结果。

我的问题是如何统一这种格式差异?我最终想要的是制作一个格式统一的新变量,然后用新的替换现有的合同开始日期。

【问题讨论】:

  • 您的数据还在,只是打印不正确。
  • 这是不正确的,因为整数表示对于相同的日期会有很大的不同,但是将它们存储为日期时间和日期。这就是为什么如果你使用 Year 函数会得到错误的结果。

标签: sas


【解决方案1】:
%let d_breakpoint=%sysfunc(putn('31dec2015'D, 13. -L));

%put &d_breakpoint;
%put %sysfunc(putn(&d_breakpoint, DATETIME. -L));

data indata;
    format contract_start_date date9.;
    do i=0 to 40;
        contract_start_date = i*5000;
        output;
    end;
    drop i;
run;

proc sql;
alter table indata add d_contract_start num format=date9.
;
update indata
    set d_contract_start= case when contract_start_date > &d_breakpoint then contract_start_date/(24*60*60)
                                else contract_start_date end
;
quit;

proc sql;
select 
      min(d_contract_start) format=date9. as min
    , max(d_contract_start) format=date9. as max
    from indata
;
quit;

该变量只有一种格式,但存储在表中的该变量的一部分 VALUES 与该格式不对应 - 如果格式用于 DATE 值(日期为自 1960 年 1 月以来的天数),但某些记录存储 DATETIME值(自 1960 年 1 月 1 日午夜以来的秒数),结果不正确。

因此,您需要将值修改为只有一种类型 - DATE 或 DATETIME。 上面的代码会将其更改为 DATE 值。

这个想法是定义一个断点值 - 上面的值将被视为 DATETIME 值,其余的将被视为 DATE 值并保持不变。

在我的示例中,我选择了 DATE 值 31dec2015(即 20453)作为断点。所以这表示 31dec2015 为 DATE,而 01JAN60:05:40:53 为 DATETIME。 低于 20453 的值被视为 DATE 值,高于 20453 的值被视为 DATETIME 值。

【讨论】:

  • 我基于以下事实得出了类似的解决方案:如果您从 datetime 获取 Year 函数,它几乎肯定会返回 1960 年左右的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多