본문 바로가기

Oracle/SQL

SQL 단일행 함수 -변환함수 (To_char) 문자형으로 변환

변환함수 (데이터 유형을 변환하는 함수 )

데이터 유형  : 문자형, 숫자형, 날짜형

  1. to_char : 문자형으로 변환하는 함수
  2. to_number : 숫자형으로 변환하는 함수
  3. to_date : 날짜형으로 변환하는 함수

날짜를 문자로 출력할때 사용할 수 있는 날짜 포맷

RRRR, YYYY : 년도 4자리

RR, YY : 년도 2자리

MM, MON : 달

DD : 일

DAY, DY, D : 요일

WW, IW : 주

HH, HH24 : 시간

MI : 분

SS : 초


RR 과 YY 의 차이점 

RR

1981

현재 연도에서 가장 가까운 연도로 인식

YY

2081

현재 세기로 인식

—>2050 년 이되면 ? ㅋㅋㅋ 오라클에서 해결방법을 준다고함 ! 

오라클 날짜 형식을 살펴보면

대부분 한국에서는 RR/MM/DD 로 되어있다.

만약 날짜 형식 변경하고 싶다면

alter session set pls_date_format = 'YY/MM/DD' ;

하게 되면 변경 된다.


날짜형 —> 문자형으로 변환함수 (to_char)

오늘이 무슨 요일인지 출력하시오

select to_char(sysdate , 'day')

from dual;

예제 : emp14 테이블에서 내가 무슨 요일에 태어났는지

select to_char(birth ,'day')

from emp14

where ename = '이름 '

-> 무슨요일을 출력해야하므로 select 절에 요일을 나타내는 문장을 작성한다. 

그리고 누구를 검색할건지 where 절에 기술한다. 

문제 : emp14 테이블에서 수요일에 태어난 학생들 이름, 생일 출력

select ename, birth

from emp14

where to_char(birth, 'day') = '수요일' ;

-> 문제의 조건이 수요일에 태어난것이므로 where 절에 검색조건을 기술한다. 

문제 : 이름과, 입사일, 입사한 년도를 (4자리로 )를 출력

select ename, hire date, to_char(hiredate, 'RRRR')

from emp;

응용문제 : 이름, 생일, 태어난 요일, 월화수목금토일 순으로 정렬하여 출력

select ename, birth , to_char(birth, 'day'), replace(to_char(birth, 'd'), 1, 8)

from emp14

order by 4 asc;

설명 : d 가 날짜가 숫자로 나오기 때문에 replace 하기전 날짜별 숫자들을 보면 일요일부터 1 번으로 시작한다.

일, 월, 화 순으로 가기 때문에 일요일 날짜를 제일 끝번인 8 번으로 대체 해 준뒤

order by 절로 asc 하게 출력 할 수 있다.

문제 : 월급이 1000 에서 4000 사이인 사원들의 이름과 월급과, 입사일과 입사한 년도를 4자리로 출력하는데 , 입사한 년도를 asc 하게 출력 하고, 컬럼명을 한글로 이름, 월급, 입사일, 입사년도로 출력되게 하시오

select ename as 사원이름, sal 사원월급, hiredate 사원입사일 , to_char(hiredate, 'RRRR') 입사년도

from emp

where sal between 1000 and 4000

order by 3 asc;

월급에 ',' 를 붙여서 출력하는 방법

날짜에서 년도, 달, 일, 요일을 추출하려면 TO_CHAR 를 이용하여 날짜를 문자로 명시적 형변환을 해주어야 합니다.

예제 이름과, 입사요일, 월급을 추출( 월급에 천단위를 부여할것 )

select ename, to_char(hiredate, 'day'), to_char(sal, '999,999')

from emp;

설명 : 9의 의미는 자릿수를 의미하고, 9자리에 무엇이 와도 관계가 없다( 0~9 )는 의미이다. 

문제 : 이름과, 보너스를 출력 보너스가 월급 * 1000000000으로 하고 천단위와 백만단위등을 표시되게 하시오

select ename, to_char(sal * 1000000000, '999,999,999,999,999')

from emp;
  • 금융권에서 필수적으로 사용하는 sql 식

문제 : 위의 문제 결과를 다시 출력하는데 뒤의 0 세개를 절삭하고 출력하시오

(1)

 select ename, rtrim (to_char (sal * 1000000000, '999,999,999,999,999') , '0') as 보너스

from emp;

(2)

select ename, substr(to_char (sal * 1000000000, '999,999,999,999,999') , 1, 17) as 보너스

from emp;

(3)

select ename, rtrim(trunk(to_char(sal * 1000000000,-3), '999,999,999,999,999') , '0' )as 보너스

from emp;

생각해서 유지보수가 편한걸로 sql 로 짜야한다. ( sql 을 자주 변경하지 않아도 결과가 잘 출력 될 수 있도록 )

입사년도를 4자리로 출력하는 경우

select ename, to_char(컬럼명, 'RRRR')

from emp

TO_CHAR 의 날짜포멧의 WW, IW 란?

→ 오늘이 올해의 몇번째 주 이냐 ?

select to_char(to_date('2021/01/08','RRRR/MM/DD'), 'ww')
from dual;

→ 둘이 똑같이 2021/01/04 년인데 왜 주가 다르게 나오는 이유?

WW : 무조건 1일부터 7일씩 끊어서 한주를 나타낸다.

IW : 실제 달력에 맞게 주차가 계산 (월요일부터시작). 달력상에 새로운 한주가 시작되는 월요일부터 한주씩 카운트된다.