%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;
可变仅具有一个格式,但不对应于该格式存储在表中的变量的值中的一个部分 - 如果格式为DATE值(日期作为自1jan1960的天数),但一些记录存储DATETIME值(自Janjan1960午夜以来的秒数),结果不正确。
因此,您需要将值修改为只有一种类型 - DATE或DATETIME。上面的代码会将其更改为DATE值。
想法是定义一个断点值 - 高于该值的值将被视为DATETIME值,其余值将被视为DATE值,并将保持这样的状态。
在我的例子中,我选择了31dec2015(即20453)的DATE值作为断点。所以这代表31dec2015作为DATE,而01JAN60:05:40:53代表DATETIME。 低于20453的值被认为是DATE值,高于20453的值被认为是DATETIME值。
您的数据仍然存在,只是没有正确打印。 –
它不是真的,因为整数表示在相同的日期会有很大的不同,但是它们被存储为日期时间和日期。例如,如果您使用Year函数,那么您将会得到错误的结果。 – Astro