본문 바로가기
공부/Ms-sql

MSSQL - SQLSTATE = 22007

by 리빈아빠 2018. 6. 14.
반응형

서론

보통은 날짜를 날짜형 데이터 타입으로 저장하기 때문에 이런 오류를 볼 경우가 적지만 날짜를 문자형으로 처리하는 곳도 있다. 이때 문자형을 날짜형으로 CONVERT 안해주고 단순히 문자로 범위를 넣어 조회를 하면 MSSQL에서 자동으로 CONVERT를 하여 조회하게 되는데 이때 문자형을 날짜형으로 변경하다 생기는 문제 이다. 

본론

SQLSTATE = 22007

프로그램 사용시 해당 오류가 뜨면서 조회가 안되는 경우도 있는데 원인은 문자형을 날짜형으로 변경하는 도중 비정상적인 날짜가 포함되어 있어 발생하는 현상이다. 비정상적인 날짜를 찾아 변경해 주면된다.

SELECT AA, BB FROM (
SELECT ISDATE(LAST_END_DT) AS AA, LAST_END_DT AS BB  
FROM TABLE
WHERE LAST_END_DT > '20180520' AND ST_TAG = '0') A
WHERE AA = '0'

ISDATE 함수는 해당 날짜가 정상적인 날짜 인지를 찾아주는 함수이다. 정상이면 1, 비정상이면 0으로 뱉어낸다.


따라서 위의 쿼리는 IDSDATE로 비정상인 0을 뱉어내는 데이터를 찾아주는 쿼리라고 보면 된다.

2월달인데 날짜가 29일로 되어 있다거나 1111년 과 같이 비정상적으로 존재하는 데이터가 반드시 존재할 것이다.


범위조회가 특정 범위에서는 되고 안 되고 하는 이유는 이런 데이터가 섞여 있어 비정상적인 데이터가 포함되지 않은 기간을 조회하면 정상적으로 출력되고 비정상적인 데이터가 포함되는 데이터를 조회하면 위의 에러메세지를 뱉어내는 이유가 바로 이것이다.

결론

아직은 MSSQL 함수들을 잘 몰라 엑셀로 변경해서 찾는 번거로움이 있었었는데 ISDATE를 알고 난 후 부턴 따로 엑셀에서 안 찾아도 될 것 같다.