안녕하세요. 쿼리 작성중 궁금한 부분이 생겨서 질문좀 하려고 합니다.
아래 쿼리에서 DATE 타입과 STRING(CHAR) 타입의 비교가 잘못된것은 알고있지만 글자 1개 차이로 에러 메시지가 바뀌는게 무슨이유때문인지 궁금합니다.
비교연산을 하는 과정이 어떻게 되길래 서로 다른 에러를 내는걸까요 ??
답변 기다리겠습니다!
<1번>
SELECT CASE WHEN (TO_DATE('20190710','YYYYMMDD') < '0') THEN 'Y' ELSE 'N' END
FROM DUAL
결과 : ORA-01847: day of month must be between 1 and last day of month
<2번>
SELECT CASE WHEN (TO_DATE('20190710','YYYYMMDD') < '01') THEN 'Y' ELSE 'N' END
FROM DUAL
결과 : ORA-01840: input value not long enough for date format
날짜와 문자 비교시 문자가 날짜로 자동 형변환 됩니다.
즉, TO_DATE('0'), TO_DATE('01') 이 실행된다고 보시면 됩니다.
우선 말도 안되는 쿼리입니다. 크게 의미를 두실 필요가 없긴 한데...굳이 따져보자면.
기본 날짜 포멧이 DD-MON-RR 이므로 다음 쿼리를 실행해보시고 결과 확인해 보시면 되겠네요.
SELECT TO_DATE('0') FROM dual;
SELECT TO_DATE('01') FROM dual;
SELECT TO_DATE('0', 'dd-mon-rr') FROM dual;
SELECT TO_DATE('01', 'dd-mon-rr') FROM dual;
'0' 의 경우 'dd' 와 매칭되므로 일자는 1~31 사이어야 하는데 0 이라서 에러
'01' 의 경우 'dd' 는 만족하는데 뒤에 mon-rr 이 없어서 에러