[Oracle] 주민등록번호(CHAR)를 활용하여 학생의 입학 당시의 나이 확인

    문제

    춘 기술대학교의 재수생 입학자 학번과 이름을 표시하시오.(이때, 19살에 입학하면 재수를 하지 않은 것으로 간주)

     

     

    내가 생각한 로직

    -- 태어난 년도 + 19년 != ENTRANCE_ DATE
    -- 주민등록번호 앞 두자리 => YY 포맷으로 변경
    -- 변경된 포맷 + 19년(==228개월)  => 입학한 년도 

    -- EXTRACT (YEAR FROM ENTRANCE_DATE) => 입학년도를 4자리로 추출 ?

    -- 주민번호를 가지고 태어난 년도 조회 성공 -> 하지만 모두 3/1로 조회됨 
    -- 20살이 되었을 해 조회 성공 -> 태어난 년도에서 228개월을 더했을 시점 == 20살이 되었을 해
    -- ENTRANC_DATE가 20살이 되었을 해보다 늦을 때 == 재수를 했다

     

    SELECT STUDENT_NAME, TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YYYY')"태어난년도"
                    ,ADD_MONTHS(TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YY'),228) "20살이 되었을 해"
                    ,ENTRANCE_DATE
    
    FROM TB_STUDENT
    WHERE ADD_MONTHS(TO_DATE(SUBSTR(STUDENT_SSN,1,2),'YY'),228) > ENTRANCE_DATE;
                    

     

     

    올바른 접근방법

    -- 문제에서 요구하는 내용은 현역과 삼수생을 모두 제외한 재수생만 추려내는 것 (삼수생도 포함한 결과는 245행)
    -- 0301생인 김정현 학생을 제외시키기 위해 19 초과 20 이하라는 조건식 사용

     

    SELECT STUDENT_NO, STUDENT_NAME--, MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12
    FROM TB_STUDENT
    WHERE MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12 > 19
        AND MONTHS_BETWEEN(ENTRANCE_DATE, TO_DATE(SUBSTR(STUDENT_SSN, 1, 6), 'RRMMDD'))/12 <= 20;

     

     

    틀린이유

    기준점을 태어난 년도에서 228개월을 더하는 것이 아닌, 입학년도와 태어난년도/12의 값을 가지고 비교하는 것이다.

    MONTHS_BETWEEN(DATE1,DATE2) :

    DATE1 => 입학년도

    DATE2 => 주민등록번호 앞 자리 (SUBSTR(STUDENT_SSN,1,6)를 생년월일 (TO_DATE)값으로 변경하기

    이제, 둘 다 DATE TYPE임으로 MONTHS_BETWEEN 함수를 사용할 수 있다.

    그럼 입학년도와 태어난년도 사이의 개월 수를 확인할 수 있고,

    그 개월 수  / 12 한 값이 19 초과하면서, 20 이상이거나 같을 경우 재수생을 추릴 수 있다.

     

     

    728x90

    댓글