2013-10-28 2 views
0

큰 데이터베이스가 있습니다. 거기 계약 시작 날짜가 있습니다. 문제는 이전에는 몇 가지 값이 datetime 형식으로 가져 왔고 나머지는 date9라는 점이었습니다. 결과에서 일부 SQL 쿼리 또는 데이터 쿼리는 계약 시작 날짜 뒤에 저장된 "숫자"의 차이로 인해 이상한 결과를 표시합니다.SAS에서 DateTime 문제가 발생했습니다

예를 들어 max(contract_start_date) (예 : sql을 통해)을 가져 오려면 정상적인 결과 대신 ***************이 표시됩니다.

제 질문은이 형식 차이를 어떻게 통합 할 수 있습니까? 마지막으로 통합 형식으로 새 변수를 만든 다음 기존 계약 시작 날짜를 새로운 형식으로 바꾸는 것이 좋습니다.

+0

데이터가 아직 남아 있습니다. 올바르게 인쇄되지 않습니다. –

+0

정수 표현은 동일한 날짜에 대해 매우 다르므로 datetime 및 date로 저장해야하므로 사실이 아닙니다. 그래서 Year 함수를 사용하면 잘못된 결과를 얻게됩니다. – Astro

답변

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; 

변수가 하나의 형식으로, 그러나 그 포맷에 대응되지 않는 테이블에 저장된 변수 값의 한 부분을 보유 - 포맷이 (1jan1960 이후의 일 수로서 날짜) DATE 값에 있는지하지만 일부 레코드는 DATETIME 값 (1 월 1 일 자정 이래로 경과 한 초 수)을 저장하므로 결과가 올바르지 않습니다.

따라서 하나의 유형 (DATE 또는 DATETIME)으로 값을 수정해야합니다. 위의 코드는 DATE 값으로 변경합니다.

아이디어는 중단 점 값을 정의하는 것입니다. 위의 값은 DATETIME 값으로 처리되고 나머지는 DATE 값으로 간주되어 이와 같이 유지됩니다.

제 예제에서는 DATE 값을 31dec2015 (20453)로 선택했습니다. 따라서 DATETIME으로 01JAN60 : 05 : 40 : 53 인 반면 DATE는 31dec2015를 나타냅니다. 20453 이하의 값은 DATE 값으로 간주되며 20453 이상의 값은 DATETIME 값으로 간주됩니다.

+0

필자는 datetime에서 Year 함수를 취하면 1960 년경 거의 certanly 값을 반환한다는 사실을 기반으로 유사한 솔루션을 찾았습니다. – Astro

관련 문제