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 인경우 대체되는 문자열로 변경하는것으로 작성되었다.
'DB > Oracle' 카테고리의 다른 글
Oracle Clinent Download (0) | 2018.01.30 |
---|---|
테이블스페이스 관리 및 확장 (0) | 2018.01.23 |
Oracle Split Function 구현 (0) | 2017.06.20 |
DOS Mode (CMD) 창에서 Query 결과를 File로 Export (0) | 2014.06.04 |
SQLPLUS로 다른 네트워크에 접속하기 (0) | 2014.06.04 |