좀 전에 올린 주민등록 번호로 나이 구한 후 조건 주는 쿼리문 재 질문이요! 0 13 1,561

by 신입사원 [SQL Query] [2016.01.20 12:56:09]


select  TRUNC((sysdate-to_date(세기(19,20) 컬럼 || 주민등록 앞자리 컬럼,'YYYYMMDD'))/365) 나이

from 테이블명

where TRUNC((sysdate-to_date(세기(19,20) 컬럼 || 주민등록 앞자리 컬럼,'YYYYMMDD'))/365) between 10 and (30-1)

 

이런 쿼리문이 있습니다. 세기 컬럼은 19,20 (년도)에 정보를 담고있습니다.

제 생각엔 이 쿼리문이 제대로 작동해야하는 거 같은데

where 절을 지우면 정상 작동 하는데 where 절에 저러한 조건을 주면 

ORA-01843: 지정한 월이 부적합합니다. 이러한 오류가 뜨면서 작동 되지 않네요.

쿼리문이 잘못된건가요?

 

 

by 낭만캐치 [2016.01.20 13:07:55]
select  TRUNC((sysdate-to_date(세기(19,20) 컬럼 || 주민등록 앞자리 컬럼,'YYYYMMDD'))/365) 나이

from 테이블명

where 나이 between 10 and (30-1)

 


by 신입사원 [2016.01.20 13:17:42]

where 나이 between 10 and (30-1) 

여기에서 나이 부분이 컬럼명 적으라고 하신건가요?


by 창조의날개 [2016.01.20 13:10:24]

주민등록 앞자리 컬럼 데이터에 YYMMDD 형식에 맞지 않는 데이터가 있는 것으로 보여집니다.

이런 문제로 그동안 많이들 질문 하셨네요..

아래 링크 참고하세요.

http://www.gurubee.net/article/22806

 


by 마농 [2016.01.20 13:14:44]

1. 오류 원인은

  - 잘못된 주민번호가 저장되어 있어서 그래요.

2. 쿼리 개선 권고

  - 365 로 나누면 윤년(366일)이 적용되지 않아 정확한 나이가 나오지 않습니다.

  - 날짜 차이를 365로 나누지 말고 Months_between 을 이용해 월차이를 구해 12로 나누세요.

 


by 신입사원 [2016.01.20 13:28:35]

윤년은.. 일단 천천히 생각하시로 하고 months_between 이용하게끔 수정은 해봤습니다.

where 절은 여전히 오류가 나네요..

잘못된 주민번호가 있어서 문제가 나는거면 select 절에서도 문제가 나야하지 않나요?

 


by 마농 [2016.01.20 13:33:46]

토드를 예로 들면 조회결과가 아무리 많아도 50건만 조회됩니다.

이 후 스크롤을 내릴때마다 50건씩 추가되지요. (부분 범위 처리)

그냥 단순 조회시 50 건이 조회되는데 이때 50건 안에는 오류자료가 없었던 것입니다.

스크롤 계속 내리다보면 오류를 만나게 됩니다.

조건을 주었을 때는?

조건에 의해 걸러낸 자료가 50건을 채울때까지 조건체크를 계속하게 되는데

50건을 채우기 전에 오류자료를 만난 경우입니다.


by 신입사원 [2016.01.20 13:42:14]

잘 이해한건지 모르겠네요..

where 절에서 조건을 줬는데 조건을 하나하나 검사하는 중에 오류가 날 수 있는 

데이터가 있어서 오류창이 팝업 된다는게 맞나요?


by 겸댕2후니 [2016.01.20 13:45:01]

오류가 날 수 있는 데이터가 있어서가 아니라,

운반단위(토드 기본값 50)를 채우기 전에, 해당포맷과 맞지않는

주민번호값이 있어서 오류가 발생한 것입니다.

즉, 가능성때문에 오류가 나는것이 아니라, 잘못된 값이 있기 때문에 나는 것입니다.

 


by 마농 [2016.01.20 13:46:21]

네 맞습니다.

조건 없을 때는 50건을 에러 없는 자료로 채운 거구요

조건 있을 때는 50건을 다 채우기 전에 에러자료를 만난 거죠.


by 신입사원 [2016.01.20 13:50:38]

아 툴은 Golden를 사용하고 조회만 할때는 수천건의 계산된 나이들이 표기되네요...

이 중에 에러자료를 찾아야한다니 눈 아프겠네요..

답변주신분들 많이 공부 됬습니다! 감사합니다.


by 마농 [2016.01.20 13:52:38]

눈으로 찾는다구요?

위에 링크 걸어놓은 주소는 안들어가 보셨나요?


by 신입사원 [2016.01.20 14:09:50]

아 사용해볼까도 했는데.. 제가 뭘 만들고 하기엔 아직 입사한지도 얼마 안되서..

FUNCTION을 생성해서 사용하고 삭제해주고 그래야하는건가요? 

아니면 일회용으로 사용하는 식인가요?

 

 


by 마농 [2016.01.20 14:17:18]
WITH t AS
(
SELECT TO_CHAR(sysdate - LEVEL, 'yyyymmdd') dt
  FROM dual
 CONNECT BY LEVEL <= 365 * 99  -- 대략 99년치 날짜 생성
)
SELECT a.세기
     , SUBSTR(a.주민번호, 1, 6) yymmdd
  FROM 테이블명 a
  LEFT OUTER JOIN t b
    ON a.세기||SUBSTR(a.주민번호, 1, 6) = b.dt
 WHERE b.dt IS NULL
;

 

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