0

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

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

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

4

1 回答 1

0
%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 值并保持不变。

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

于 2013-10-28T09:48:16.023 回答