%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