본문 바로가기
수업(국비지원)/Oracle

[Oracle] SQL 단일행 함수 - 형 변환 함수 to_char(), to_number, to_date

by byeolsub 2023. 4. 14.

- 묵시적 형 변환 : 오라클이 자동으로 변환함

select 1+'1' from dual; //실행 됨. 그러나 성능 취약

select 1+'a' from dual; //오류 발생. invalid number 

- 명시적 형 변환 : 수동 형 변환

1) to_char() : 숫자나 날짜 형을 지정된 형식에 맞도록 문자열로 변경하는 함수.

  • 날짜를 문자열로 변경
날짜 형식 문자 : 
 yyyy : 연도를 4자리로 표시
 yy : 연도를 2자리로 표시
 rrrr : 2000년 이후에 Y2K버그로 인해 추가된 연도 4자리로 표시
 rr : 2000년도 이후에 Y2K버그로 인해 추가된 연도 2자리로 표시.
 year : 영문으로 년도 표시. (문자로 연도 표시)

 mm : 월을 2자리로 표시.
 mon : 영문표시할 때의 약자 표시. FBE 한글은 상관없다.
 month : 영문표시 할때의 전체 월 표시. 한글은 상관 없다.

 dd : 일을 2자리로 표시.
 day :  요일을 표시. 
 ddth : 몇번째 날짜인지 표시.
예시 : 
select to_char(sysdate,'yyyy') 년도1,to_char(sysdate,'rrrr')년도2, 
  to_char(sysdate,'year') 년도3,to_char(sysdate,'rr') 년도4,to_char(sysdate,'mm') 월1,
  to_char(sysdate,'mon') 월2, //약자 표시
  to_char(sysdate,'month') 월3, to_char(sysdate,'dd') 일1, //일자표시
  to_char(sysdate,'day') 일2, //요일표시
  to_char(sysdate,'ddth') 일3, //서수표시
  to_char(sysdate,'hh') 시간1, //1~12 시
  to_char(sysdate,'hh24') 시간2, //0~24 시 
  to_char(sysdate,'mi') 분1, to_char(sysdate,'ss') 초1, 
  to_char(sysdate,'am') am //오전,오후
  from dual;
시간 : 
 hh : 하루 12시간.
 hh24 : 하루 24시간.
 mi : 분.
 ss : 초.
 am : 오전/오후.
예시 : 
select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss am day') from dual;
문제 : 
 1. 학생의 이름과 생일(birthday)을 yyyy-mm-dd 요일 형식으로 출력하기
select name,to_char(birthday,'yyyy-mm-dd day') birthday from student;

  • 숫자를 형식화 된 문자열로 변경
to_char(숫자,'형식문자') 

예시 :
select to_char(1234.56,'9999999') 숫자1, //정수 7자리. 반올림
to_char(1234,56,'0999999') 숫자2, //정수 7자리 빈자리 0으로 채움. 
                                   앞자리에 0이 들어가면 유효하지 않은 숫자
to_char(12.3456,'$9999.99') 숫자3, //$표시. 소숫점 이하 2자리 출력
to_char(12.3456,'9999.99') 숫자4, //소숫점 이하 2자리 출력
to_char(1234.56,'9,999.99') 숫자5 //세자리마다 , 표시하고 소숫점 이하 2자리 출력
from dual;
문제 : 
 1. 교수의 이름,현재급여,연봉 출력하기.
  단 연봉은 급여*12이고, 출력시 세자리마다 , 표시하기
select name,pay,to_char(pay*12,'99,999') 연봉 from professor;

2) to_number : 문자 → 숫자형

예시 : 
select '12'+10 from dual; //묵시적 형변환

select to_char('12')+10 from dual; //명시적 형변환

3) to_date : : 문자 → 날짜형

예시 : 
 1. '20220816'을 날짜형태로 변환.
select to_date('20220816','yyyymmdd') from dual;

 2. '20220817'날짜를 '2022-08-17 수요일' 형태로 변환.
select to_char(to_date('20220817','yyyymmdd'),'yyyy-mm-dd day') from dual;
문제 : 
 1. 교수테이블에서 입사일 2개월 후 다음달 1일을 정식입사일로 한다.
 교수의 이름,입사일,정식입사일을 출력하기. 단 정식입사일의 요일도 표시하기
select name,hiredate,
to_char(last_day(add_months(hiredate,2))+1,'yyyy-mm-dd day') 정식입사일
from professor;