728x90
반응형
처음 이 문제를 접했을 때, 현재 연도 - 출생연도의 포맷을 생각했지만 어떻게 표현해야 할지 약간 헤맸었다.
스스로 푼 방법과 다른 웹사이트를 참고해서 크게 3가지의 해결책을 찾았다.
JUMIN : 주민등록번호 컬럼
주민번호의 구성을 생각해보면 총 13자리가 앞 6자리 + 뒤 7자리로 구성되어 있다
출생연도 뒷자리(2자리) + 출생월(2자리) + 출생일(2자리) + '-' + '성별을 구분하는 숫자' (1자리)+ (나머지 6자리)
1. 현재 연도 - 문자열이나 컬럼을 합쳐주는 '||' 를 이용해 '19' + 출생연도 뒷자리 붙이기
TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - TO_NUMBER("19" || SUBSTR(JUMIN,1,2))
2. 현재 연도 - 숫자1900을 숫자 변환된 출생연도 뒷자리 더하기
TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - (1900+TO_NUMBER(SUBSTR(JUMIN,1,2))
3. 7번째 자리 기반 출생연도를 활용한 CASE WHEN 구문
이건 이번에 찾아보면서 알게된 사실인데 성별을 구분하는 숫자 7번째 자리가 출생연대에 따라 다르다고 합니다!
- 9: 1800 ~ 1899년에 태어난 남성
- 0: 1800 ~ 1899년에 태어난 여성
- 1: 1900 ~ 1999년에 태어난 남성
- 2: 1900 ~ 1999년에 태어난 여성
- 3: 2000 ~ 2099년에 태어난 남성
- 4: 2000 ~ 2099년에 태어난 여성
- 5: 1900 ~ 1999년에 태어난 외국인 남성
- 6: 1900 ~ 1999년에 태어난 외국인 여성
- 7: 2000 ~ 2099년에 태어난 외국인 남성
- 8: 2000 ~ 2099년에 태어난 외국인 여성
출처: https://taisou.tistory.com/470 [Release Center:티스토리]
(어떤 분이 잘 정리해주셔서 자료를 가지고 왔습니다 ㅎㅎ)
--> 즉, 7번째 자리가 0,9인 분들은 1800년대생, 1,2,5,6은 1900년대생, 3,4,7,8은 2000년대생이라는 거죠!
TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) - TO_NUMBER(CASE WHEN SUBSTR(JUMIN,7,1) IN ('1','2','5','6') THEN '19'
WHEN SUBSTR(JUMIN,7,1) IN ('3','4','7','8') THEN '20' END SUBSTR(JUMIN,1,2)
(1800년대생은 굳이 표기할 이유가 없기 때문에 제외했습니다)
CASE WHEN구문을 통해 각 번호가 해당하는게 1900년대인지 2000년대인지 구분했죠
728x90
반응형
'SQL' 카테고리의 다른 글
SQL Subquery 서브쿼리 사용하기 (1) | 2022.09.13 |
---|---|
[Oracle] Join (Inner, Outer, ANSI Join) (1) | 2022.09.13 |
[Oracle] SQL 그룹 함수 (Group By, Having) (0) | 2022.09.08 |
[Oracle] SQL (DECODE, CASE 함수) (0) | 2022.09.07 |
[Oracle] SQL BASICS (Phrase, 날짜, 변환 함수) (0) | 2022.09.07 |
댓글