ORA-01847 : day of month must be between 1 and last day of month




왜 DB 관리툴로 돌리면 잘 수행 되는 쿼리가 서버에서 실행되면 오류가 발생할까?..


혹은


이와 반대의 경우를 경험할 때가 있다.



일반적으로 이 오류는 예를 들어 2018-12-32이라는 문자열을 날짜로 변환할 때 발생한다.


즉, 달력에 없는 날짜를 문자열을 이용하여 Date 타입으로 변환할 때 발생한다는 이야기이다. 


별도의 타입에 대한 변환이 명시되지 않으면 알아서(?) 타입을 변환해주는 오토케스팅이 낳은 좋지 않은 케이스라 할 수 있다. 





의외로 잘 깜박하는 예시를 들어보록 하자.


컬럼 Date_A 가 있다. 이 컬럼은 Date Type이며 Null 일 수 있다.


이 컬럼을 이용하여 아래와 같이 작성하면 ORA-01847을 만날 수 있다. 


1
2
3
4
        SELECT 
              ,TO_CHAR(NVL(A.DATE_A, '9999-12-31'), 'YYYY-MM-DD') AS DATE_A
 
        FROM  TABLE_NAME A
cs



위의 쿼리는 다음과 같이 작성되는것이 오류를 예방하고 혼란에 빠지지 않을 수 있다.



1
2
3
4
        SELECT 
              NVL(TO_CHAR(A.END_DATE, 'RRRR-MM-DD'), '9999-12-31')
 
        FROM  TABLE_NAME A
cs



설명을 약간 하자면 NVL 안에서 처리될때 문자열이 Null 인경우 문자열로 치환되어야 하는것이다. 
타입이 다른 것으로 치환되지 않도록 쿼리를 작성하는것이 포인트 이다. 

고쳐진 쿼리는 문자열로 변환 후 해당 문자열이 Null 인경우 대체되는 문자열로 변경하는것으로 작성되었다.




+ Recent posts