본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/Database

지정한 Year, Month 및 Day 매개 변수가 DateTime을 표현할 수 있는 범위를 벗어났습니다.

by 체리그루브 2018. 2. 22.
728x90

프로젝트에서 DBA 와 데이터 이관을 맡아 진행 중이다.


아래와 같은 메시지를 만났다.


지정한 Year, Month 및 Day 매개 변수가 DateTime을 표현할 수 있는 범위를 벗어났습니다.


디버깅 방법이 딱히 떠오르지 않았다. 

소스서버인 Oracle 서버에서 데이터를 읽다가 나는 에러인데, 이번에 읽어 들인 데이터는 11만 건이 넘었다. 


구글링 해봐도 딱히 내게 맞는 답이 없다. 


11만건을 CSV 로 내려 조사했다.

날짜 타입을 엑셀에서 필터링 해서 봐도 딱히 문제 없어 보였다.

이들 데이터를 다시 Notepad++ 로 옮겨 붙이고 년,월,일,시,분을 모두 탭으로 나누고,

다시 엑셀에 갖다 붙였다. 

(이때 빈줄은 모두 없애야 함. (필터링을 위해) Nodepad++ 너무 편하다~)


엑셀에 붙여보니, 아래와 같다. 

이제 앞서 보다 훨씬 정확하게 데이터 품질을 검증 할 수 있게 됐다.



그리고 드디어 문제를 발견했다.

Oracle 에서는 DateTIme2 를 지원해서 날짜의 범위가 광범위하다. 0001년도부터 지원~

그런데, MSSQL 에서 내가 지정한 데이터 타입은 Datetime 이고 이것은 1900-01-01부터 지원한다. 그래서 타입 에러가 발생한 것.



위의 날짜는 0002-01-01 00:00:00 로 등록된 것을 확인했다.


select * from $$_rslt where $$ < '1900-01-01';

select * from ##_rslt where ## < '1900-01-01';  -- 18 개 발견

select * from &&_rslt where && < '1900-01-01';

select * from $$_rslt where $$_DT < '1900-01-01';


이렇게 확인된 데이터를 제외하고 다시 이관을 실시했고,

제외된 데이터는 다시 고객과 협의 하여, 처리할 예정이다.



728x90

댓글