我有一个很大的数据库。那里有合同开始日期。问题是,在前一段时间,有几个值作为日期时间格式导入到那里,而其余的只是 date9。结果,由于看到存储在合同开始日期后面的“数字”不同,现在一些 sql 查询或数据查询显示出奇怪的结果。
就像当我想获得max(contract_start_date)
(例如通过 sql)时,我会得到***************
而不是正常的结果。
我的问题是如何统一这种格式差异?我最终想要的是制作一个具有统一格式的新变量,然后用新的替换现有的合同开始日期。
我有一个很大的数据库。那里有合同开始日期。问题是,在前一段时间,有几个值作为日期时间格式导入到那里,而其余的只是 date9。结果,由于看到存储在合同开始日期后面的“数字”不同,现在一些 sql 查询或数据查询显示出奇怪的结果。
就像当我想获得max(contract_start_date)
(例如通过 sql)时,我会得到***************
而不是正常的结果。
我的问题是如何统一这种格式差异?我最终想要的是制作一个具有统一格式的新变量,然后用新的替换现有的合同开始日期。
%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 值。