%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;
변수가 하나의 형식으로, 그러나 그 포맷에 대응되지 않는 테이블에 저장된 변수 값의 한 부분을 보유 - 포맷이 (1jan1960 이후의 일 수로서 날짜) DATE 값에 있는지하지만 일부 레코드는 DATETIME 값 (1 월 1 일 자정 이래로 경과 한 초 수)을 저장하므로 결과가 올바르지 않습니다.
따라서 하나의 유형 (DATE 또는 DATETIME)으로 값을 수정해야합니다. 위의 코드는 DATE 값으로 변경합니다.
아이디어는 중단 점 값을 정의하는 것입니다. 위의 값은 DATETIME 값으로 처리되고 나머지는 DATE 값으로 간주되어 이와 같이 유지됩니다.
제 예제에서는 DATE 값을 31dec2015 (20453)로 선택했습니다. 따라서 DATETIME으로 01JAN60 : 05 : 40 : 53 인 반면 DATE는 31dec2015를 나타냅니다. 20453 이하의 값은 DATE 값으로 간주되며 20453 이상의 값은 DATETIME 값으로 간주됩니다.
데이터가 아직 남아 있습니다. 올바르게 인쇄되지 않습니다. –
정수 표현은 동일한 날짜에 대해 매우 다르므로 datetime 및 date로 저장해야하므로 사실이 아닙니다. 그래서 Year 함수를 사용하면 잘못된 결과를 얻게됩니다. – Astro