라일락 꽃이 피는 날

[Oracle] 단일행 함수 - 변환 함수 본문

프로그래밍/Oracle

[Oracle] 단일행 함수 - 변환 함수

eunki 2022. 5. 26. 00:14
728x90

변환 함수는 데이터의 유형을 변환하는 함수이다.

데이터 유형의 종류로는 문자형, 숫자형, 날짜형이 있다.

 

 

 

문자형 ↔ 날짜형 변환

to_char(날짜, '날짜포맷')
to_date(문자, '날짜포맷')

 

 

 

날짜 형식 확인

select NLS_DATE_FORMAT
    from nls_session_parameters;

 

 

 

날짜 포맷

  • RRRR, RR, YYYY, YY : 년도
  • MM, MON : 달
  • DD : 일
  • DAY, DY, D : 요일
  • WW, IW : 주
  • HH, HH24 : 시간
  • MI : 분
  • SS : 초

 

 

 

예제 1. 오늘이 무슨 요일인지 출력

select to_char(sysdate, 'day'), to_char(sysdate, 'dy'), to_char(sysdate, 'd')
    from dual;

일요일이 1 이고, 월요일이 2 이고, 토요일이 7 이다.

 

 

 

예제 2. 이름, 입사일, 입사한 년도를 출력

select ename, hiredate, to_char(hiredate, 'RRRR'), to_char(hiredate, 'RR')
        , to_char(hiredate, 'YYYY'), to_char(hiredate, 'YY')
    from emp;

 

RR 날짜 포맷과 YY 날짜 포맷의 차이점

RR : 현재 연도를 기준으로 가까운 연도 (81년 → 1981년)

YY : 현재 연도를 기준으로 현재 세기로 인식 (81년 → 2081년)

 

 

 

예제 3. 이름과 월급을 출력할 때, 천 단위를 부여해서 출력

select ename, sal, to_char(sal, '999,999')
    from emp;

 

 

 

예제 4. 81년 11월 17일에 입사한 사원들의 이름과 입사일을 출력

select ename, hiredate
    from emp
    where hiredate = '81/11/17';
    
select ename, hiredate
    from emp
    where hiredate = '81-11-17';
    
select ename, hiredate
    from emp
    where hiredate = '81.11.17';

'년도 월 일’ 순서만 지키면 사이에 /, -, . 을 사용 하는 건 자유다.

 

 

 

예제 5. 프랑스에서 81년 11월 17일에 입사한 사원들의 이름과 입사일을 출력

select ename, hiredate
    from emp
    where hiredate = '17/11/81';

나라마다 날짜를 보는 기준이 다르기 때문에, 일/월/년도 순으로 검색해야 한다.

 

 

select ename, hiredate
    from emp
    where hiredate = to_date('1981/11/17', 'RRRR/MM/DD');
    
select ename, hiredate
    from emp
    where hiredate = to_date('17/11/1981', 'DD/MM/RRRR');

위와 같이 작성하면 어느 나라에서든 에러 없이 조회 된다.

 

 

 

예제 6. 아래의 SQL이 수행되는지 확인

select ename, sal
    from emp
    where sal like '30%';

다른 DB 소프트웨어에서 수행하면 에러가 발생하지만 오라클은 에러가 안 나고 수행된다.

즉, 암시적 형 변환이 발생했다.

 

 

암시적 형 변환이 발생했는지 알기 위해서 오라클이 내부적으로 이 SQL을 어떻게 수행했는지 확인한다.

explain plan for
select ename, sal
    from emp
    where sal like '30%';
    
select * from table(dbms_xplan.display);

내부적으로 수행한 SQL을 확인해보니까 sal를 to_char 로 감싸서 문자형으로 변경해주고 있다.

‘30%’ 가 문자형이어서 sal를 문자형으로 변경해준 것이다.

위와 같이 암시적 형 변환이 발생하게 되면 성능이 느려지는 경우가 생긴다.

그래서 우리는 암시적 형 변환이 발생하지 않도록 평상시에 SQL을 잘 작성해줘야 한다.

728x90