빅데이터 공부/SQL

SQL 변환함수(to_char, to_number, to_date)

김 리안 2022. 7. 17. 09:09

변환함수 : 데이터 타입 (날짜, 문자, 숫자) 을 변환 목적 사용
1. to_char : 문자가 아닌 값을 문자로 변경
2. to_number : 숫자가 아닌 값을 숫자로 변경(숫자로 변경 가능한 경우)
3. to_date : 날짜가 아닌 값을 날짜로 변경


변환함수 : 데이터 타입 (날짜, 문자, 숫자) 을 변환 목적 사용
--1. to_char : 문자가 아닌 값을 문자로 변경
-- to_char(대상 [, 포맷])

select to_char(1111)    -- 숫자를 문자로
  from dual;

select to_char(sysdate) -- 날짜를 문자로
  from dual;

--1) 숫자를 문자로 변환

select to_char(1111, '9,999'),      --천단위 구분기호(9: 한자리의 숫자, 0: 한자리 숫자(맨앞자리 0리턴))
       to_char(1111, '9,999,999'),  --매칭되지 않는 자리수 공백으로 표현
       to_char(1111, '0,000,000'),  --매칭되지 않는 자리수 0으로 표현
       to_char(1111, '0,999,999'),  --매칭되지 않는 자리수 0으로 표현
       to_char(1111, '9999.00'),    --소수점 자리 표현
       to_char(1111, '9999.99'),    --소수점 자리 표현
       to_char(1111, '$9999.99')    --삽입 가능 
       from dual;
  
--2) 날짜를 문자로 변환(날짜의 포맷 변경 목적)

select sysdate, to_char(sysdate, 'YY-MM-DD')
  from dual;

--[연습문제]
--employees 테이블을 사용하여 10% 인상된 salary의 값을 아래와 같은 형식으로 변경
-- 10,000만원

select *
  from employees;

select first_name,
       to_char(salary*1.1, '99,999') || '만원'
  from employees;

select first_name,
       trim(to_char(salary*1.1, '999,999')) || '만원'
  from employees;
  
--2. to_number : 숫자가 아닌 값을 숫자로 변경(숫자로 변경 가능한 경우)
--to_number(대상)

select '1' + 1  --묵시적 형 변환에 의해 to_number('1') +1로 연산됨 
  from dual;
  
select '1,200' * 1.1 --천단위 콤마는 묵시적 형 변환과 to_number가 안된다. 딱 숫자처럼만 생겨야해
  from dual;

select to_number(replace('1,200', ',','')) *1.1 --replace로 콤마 없애기 / , 삭제 후 숫자 변경 가능
  from dual;
  
--3. to_date : 날짜가 아닌 값을 날짜로 변경
--to_date(대상[, 포맷])
--to_char(날짜, 'day')
--포맷 생략 시 년월일 순으로 해석
--년월일 순이 아닌 경우 포맷을 전달하여 올바른 순서로 해석되게 해야 함
--sql에서는 날짜처럼 생긴 문자값, 숫자값 모두 날짜로 해석 가능

select '2022/06/08' +100 --연산불가(아직 날짜로 정의되지 않음)
  from dual;
  
 select to_date('2022/06/08') +100  --가능( 날짜로 정의 됨)
   from dual;
   
 select to_char('2022/06/08', 'day') --불가(첫번째 자리는 날짜 형태로 삽입)
   from dual;
   
select to_char(to_date('2022/06/08'), 'day') -- 가능
   from dual;
   
select to_date('06/28/2022')  -- 불가  / 우리나라 프로그램은 연월일이 기본
  from dual;
  
select to_date('06/28/2022', 'MM/DD/YYYY'),  -- 포맷 지정하면 오렌지폼으로 받아들임
       to_char(to_date('06/28/2022', 'MM/DD/YYYY'), 'MM-DD-YYYY')
   from dual;


--[연습문제]
--emp 테이블에서 각 직원의 이름, 부서번호, 급여와 보너스를 출력
--단, 보너스는 2022년 06월 30일 기준 근무일수를 기준으로 
--sal * 0.1 * 근무일수(정수)로 계산

select *
  from emp;
  
select ename, deptno, sal, 
       (to_date('2022/06/30') - hiredate) * 0.1 * sal as BONUS
  from emp;
  
select ename, deptno, sal, 
       (to_date('2022년 6월 30일', 'yyyy"년" mm"월" dd"일"') - hiredate) * 0.1 * sal as BONUS
  from emp;
  
  
--[연습문제]
--월요일에 태어난 학생의 이름, 학년, 주민번호 출력
--단, 월요일에 태어난 조건은 주민번호 컬럼으로 전달

select *
from student;

alter session set nls_date_language = 'Korean';

select name, grade, jumin
  from student 
 where trim(to_char(to_date(substr(jumin, 1, 6), 'RRMMDD'), 'day')) = '월요일';
  -- 연도를 rr로 하면 크기에 따라 1900년대/ 2000년대 알아서 리턴
 
select to_char(to_date(substr(jumin, 1, 6)), 'day')
  from student;