ORA-01847 오류 관련하여 0 2 4,057

by 봄빛 [Oracle 기초] [2018.10.31 17:14:19]


개통일자 : DEV_RGST_DT       (DATE TYPE    nullable)
종료일자 : DEV_VALD_END_DT (DATE TYPE    nullable​) 
​
개통일로부터 14일 이내인 데이타를 제외하고 조회하는 쿼리입니다.
오라클 오렌지에서 실행했을때는 정상 결과 나오는데 유닉스 서버에서 배치(데이타생성배치)실행한경우 
ORA-01847(day of month must be between 1 and last day of month )​ 오류가 나옵니다.
​
아래 세가지 방법은 서버에서 오류발생합니다.
(WHERE절에서 사용)
방법1) TO_DATE(TO_CHAR(NVL(A.DEV_VALD_END_DT,'99991231'),'YYYYMMDD'),'YYYYMMDD') - TO_DATE(TO_CHAR(A.DEV_RGST_DT,'YYYYMMDD'),'YYYYMMDD') > 14
방법​2) TO_CHAR(A.DEV_RGST_DT+13, 'YYYYMMDD') < TO_CHAR(NVL(A.DEV_VALD_END_DT, '99991231'), 'YYYYMMDD')
방법​3) (NVL(A.DEV_VALD_END_DT,LAST_DAY('99991231')) - A.DEV_RGST_DT)  >  14
​
일단은 네번째 방법으로 해결은 하였습니다.
방법​4) ((A.DEV_VALD_END_DT - A.DEV_RGST_DT) > 14 OR A.DEV_VALD_END_DT IS NULL)
​
위에 세가지 방법에 어떤 문제가 있는건지 궁금합니다. 

 

 

 

 

by 마농 [2018.10.31 18:01:18]

방법1)은 괄호가 안맞고요.
방법2)은 14가 없고요.
NVL(date, char)의 두값의 형식이 다릅니다. 묵시적 형변환 발생
TO_DATE(TO_CHAR()) 하는 이유가? 시분초 제거 목적이라면? TRUNC(date) 이용
LAST_DAY('99991231')도 date 가 필요한데 char 가 입력되어 묵시적 형변환 발생
날짜의 형변환시에는 반드시 대응되는 정확한 포멧을 지정하는 습관이 필요합니다.
묵시적 형변환의 경우 포멧 지정 디폴트로 되어 에러 가능성이 높습니다.
즉, 수행 환경에 따라 에러가 나기도 하고 안나기도 합니다.
의미상으로도 '99991231' 보다는 현재날짜로 바꾸는게 맞을 것 같습니다.
TRUNC(NVL(a.dev_vald_end_dt, sysdate)) - TRUNC(a.dev_rgst_dt) > 14


by 봄빛 [2018.11.01 09:05:20]
옮겨적으면서 오타가 좀 있었네요 죄송합니다

본문에 수정햇습니다.

답변감사합니다.

 

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