months_BETWEEN 조회시 날짜 형식 에러 0 3 910

by 유선일 [Oracle 기초] [2020.08.16 16:23:52]


안녕하세요.

아래 쿼리를 실행하면 
ORA-01840: 입력된 값의 길이가 날짜 형식에 비해 부족합니다
라고 나오는데 어디가 문제인지 모르겠습니다.
and a.age >= 7를 빼면 조회가 되는데
이걸 넣으면 날짜 형식 오류가 나는데 months_between 리턴값은 숫자 아닌가요?
뭐가 문제인지...
도와주세요...

SELECT DEPTCODE, EMPNO, EMPNAME, ENTERDATE,
       WORK_YEAR, WORK_MONTH,
       FAMILYNAME, RELATIONCODE, RESIDENTNO1, AGE,
       CASE 
            WHEN AGE BETWEEN 20 AND 27 THEN 'University'
            WHEN AGE BETWEEN 17 AND 19 THEN 'high school'
            WHEN AGE BETWEEN 14 AND 16 THEN 'middle School'
            WHEN AGE BETWEEN 8  AND 13 THEN 'elementary'
            ELSE 'Preschool'
       END AS SCHOOL
FROM
(
SELECT T1.DEPTCODE, T1.EMPNO, T1.EMPNAME, T1.ENTERDATE,
       FUN_CALC_YEARS_CNT(ENTERDATE,TO_CHAR(SYSDATE, 'yyyymmdd'), 'Y') WORK_YEAR,
       FUN_CALC_YEARS_CNT(ENTERDATE,TO_CHAR(SYSDATE, 'yyyymmdd'), 'M') WORK_MONTH,
       T2.FAMILYNAME, T2.RELATIONCODE,
       CRYPTSTRING.DECRYPT(T2.RESIDENTNO1,'BDS3018508125')AS RESIDENTNO1,
       CRYPTSTRING.DECRYPT(T2.RESIDENTNO2,'BDS3018508125')AS RESIDENTNO2,
       months_BETWEEN(TRUNC(SYSDATE,'YEAR'), 
       TRUNC(TO_DATE( CASE
                      WHEN SUBSTR( CRYPTSTRING.DECRYPT(T2.RESIDENTNO2,'BDS3018508125'), 1, 1) IN ('1','2','5','6')  THEN '19'||CRYPTSTRING.DECRYPT(T2.RESIDENTNO1,'BDS3018508125')
                      WHEN SUBSTR( CRYPTSTRING.DECRYPT(T2.RESIDENTNO2,'BDS3018508125'), 1, 1) IN ('3','4','7','8')  THEN '20'||CRYPTSTRING.DECRYPT(T2.RESIDENTNO1,'BDS3018508125')
                      END,'YYYYMMDD'),'YEAR')) / 12 + 1 AS AGE
FROM P1_MASTER T1, P1_FAMILIES T2
WHERE T1.EMPNO = T2.EMPNO(+)
and SERVICEKINDCODE  = '1'
AND T2.SCHOOLGUBN = '2'
) A
where a.work_year >= 1
and a.age >= 7

 

by pajama [2020.08.17 00:11:20]

RESIDENTNO1 컬럼에 NULL 값은 없으신가요? 

SQL> ;
  1  SELECT     *
  2  FROM (
  3  SELECT MONTHS_BETWEEN
  4     (TRUNC(SYSDATE,'YEAR'),
  5      TRUNC(TO_DATE('20'||null,'YYYYMMDD'),'YEAR' )) / 12 + 1 age
  6      FROM DUAL
  7  ) a
  8*
SQL> /
    TRUNC(TO_DATE('20'||null,'YYYYMMDD'),'YEAR' )) / 12 + 1 age
                       *
ERROR at line 5:
ORA-01840: input value not long enough for date format

 


by 우리집아찌 [2020.08.17 09:03:05]
-- 두일자 사이에 달의 수를 조회 
SELECT MONTHS_BETWEEN(SYSDATE,SYSDATE-31) MM  FROM DUAL;  

 


by 마농 [2020.08.18 08:24:31]

겉으로 보이는 오류가 날만한 구문은 months_between 으로 보이긴 한데.
이게 주민번호가 잘못되었을 가능성은 적어 보이고,
fun_calc_years_cnt 안에서 오류가 날 가능성도 있어 보입니다.
enterdate 항목이 Null 또는 8자리가 아닌 값이 있는지 확인해 보세요.
residentno1 에도 Null 또는 8자리가 아닌 값이 있는지 확인해 보세요.
residentno2 에 Null 또는 시작문자가 숫자가 아닌 값은 없는지 확인해 보세요.

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