TO_DATE로 날짜 비교시 궁금한 부분입니다. 0 5 1,865

by kignues [SQL Query] [2019.01.15 11:26:29]


안녕하세요. 쿼리 작성중 궁금한 부분이 생겨서 질문좀 하려고 합니다.

아래 쿼리에서 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

by 우리집아찌 [2019.01.15 13:31:55]

저는 둘다 똑같은 에러가 나네요.

select * from nls_session_parameters

날짜 포맷이 어떤지 확인해보세요.

디폴트 포맷값으로 인식되는것 같은 느낌이 드네요.


by kignues [2019.01.15 13:51:26]

// 우리집아찌

답변달아주신 쿼리를 실행해보니 NLS_DATE_FORMAT = DD-MON-RR 이렇게 나옵니다.
이 값이 DATE 타입과 STRING 타입을 비교할경우 자동형변환에 사용되는 포맷이 되는걸까요 ??


by 우리집아찌 [2019.01.15 14:14:41]

일단 제쪽에서 재현은 안되네요.

에러만 놓고 봤을때는

1번은 포맷은 맞는데 날짜가 안맞는경우이고(예:12/32 ) 

2번은 포맷자체가 틀렸다는건데요.

그래서 1번 경우는 FORMAT에는 

SELECT TO_DATE('32','DD') DT FROM DUAL

이런식으로 포맷에서 인식은 되지만 문제가 있지 않은가해서 유추해본겁니다.

 


by 마농 [2019.01.16 08:20:49]

날짜와 문자 비교시 문자가 날짜로 자동 형변환 됩니다.
즉, 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 이 없어서 에러


by 키그 [2019.01.28 17:45:10]

말씀하신대로 에러로그가 나는것을 확인했습니다!
쓸데없는질문이긴했지만 답변달아주셔서 정말 감사합니다 ^^*

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입