단일행함수-변환함수



<날짜 출력 형식>


  • YYYY : 네자리 연도표기 (1999,2000)
    YY : 두자리로 표현된 년도. 앞의 두자리는 현재 세기의 년도를 이용한다. ******99년은 2099년을 의미한다.
    RR : 두자리로 표현된 년도. 앞의 두자리는 현재년도와 가까운 년도를 이용한다. ********* 99년은 1999년 20년은 2020년

  • MM : 두자리 표현
    MONTH : 영문이나 한글로 표현된 월 (MARCH, APRIL, 2월)
    MON : 약자로 표현된 영문및 한글 월 (MAR, APR, 2월) 한글 경우에는 MONTH와 동일

  • DD : 숫자일자
    DAY : 영문이나 한글 요일
    DY : 약자로 표현된 요일(SUN MON 월, 일) 

  • HH24 : 24시기준
    HH : 1-12 AM/PM
  • 분 
    MI : 두자리 분 표시

  • SS : 두자리 초표시
    SSSS : 하루를 초로 환산한다음 표현 (0-86399)
  • 오전/오후: AM/PM

 





<숫자출력형식>

  • 9 : 숫자의 출력 폭 지정(자리수가 부족하면 생략)
  • 0 : 선행 0표기
  • $ : 화페표기 (달러)
  • L : 지역 화폐 표기 (각 국가코드에 따라 다름)
  • ,  : 쉼표위치지정
  • .  :  마침표 위치지정
  • MI : 음수의 - 기호를 오른쪽에 표기
  • EEEE : 실수 표현법을 이용




<변환함수>

  • TO_CHAR : 날짜나 숫자를 문자로 변환한다. 출력데이터 형식을 지정한다 (출력포맷) 
    예) TO_CHAR(날짜, 출력형식)
          TO_CHAR(숫자, 출력형식)
  • TO_DATE : 데이터를 날짜 형식으로 해석한다.
    예) TO_DATE(문자, 해석형식)
  • TO_NUMBER : 데이터를 숫자로 해석한다. 대부분의 경우 오라클의 자동형변환에 의해 숫자문자는 자동변환됨으로 잘쓰이지 않음. PL-SQL에서 가끔 사용됨

 

 

 

 

<Exercise>

--현재날짜를 다양한 방식으로 출력
SELECT TO_CHAR(sysdate, 'YYYY/MM/DD') "date",
       TO_CHAR(sysdate, 'YYYY/MM/DD:HH24:MI:SS') "date",
       TO_CHAR(sysdate, 'YY/MM/DD:HH:MI:SS AM') "date"
FROM dual;

SELECT TO_CHAR(sysdate, 'DD MONTH YYYY') ToDay
FROM dual;

SELECT TO_CHAR(sysdate, 'DAY MON YY') ToDay
FROM dual;

SELECT TO_CHAR(sysdate, 'DY Mon YY') ToDay
FROM dual;

SELECT TO_CHAR(sysdate, '"오늘은 " YYYY "년" MM "월 " DD "일 입니다" ') ToDay
FROM dual;


--10번 부서 사원의 입사일을 다음의 형식으로 검색
-- ***사원의 입사입은 ****년 **월 **일입니다
SELECT ename || ' 사원의 입사일은 ' || TO_CHAR(hdate, 'YYYY"년 " MM"월 "DD"일 입니다." ')
FROM emp
WHERE dno = '10';


--다양한 형식으로 숫자 출력
SELECT TO_CHAR(12345.678, '999,999.99999') num
FROM dual;

SELECT TO_CHAR(12345.678, '999,999.999') num
FROM dual;

SELECT TO_CHAR(12345.678, '9,9999.9') num
FROM dual;

SELECT TO_CHAR(12345.678, '9,999.9') num
FROM dual;

SELECT TO_CHAR(1234, '$999,999') num
FROM dual;

SELECT TO_CHAR(1234, 'L999,999') num
FROM dual;

SELECT TO_CHAR(-1234, '999,999MI') num
FROM dual;

SELECT TO_CHAR(123456789, '9.999EEEE') num
FROM dual;
            

-- 10번 부서의 사원의 보너스가 급여의 몇 퍼센트인지 검색한다
-- 급여는 월간, 보너스는 연간 
SELECT eno, ename, 
       TO_CHAR(NVL(comm,0)/(sal*12)*100, '99')||'%' 급여비율
FROM emp
WHERE dno='10';


--1992년 이전에 입사한 사원의 정보를 검색하자
SELECT eno, ename, hdate
FROM emp
WHERE hdate < TO_DATE('1992/01/01', 'YYYY/MM/DD');

SELECT eno, ename, hdate
FROM emp
WHERE hdate < '1992/01/01'; 
-- 이경우 세션의 출력형식이 달라질 시(99/01/01. 1992_02_01) 
-- 비교가 불가능해지므로 TO_DATE 함수를 사용하는 것을 권장한다.
--1. 학생의 평균 평점을 다음 형식에 따라 소수점 이하 두 자리까지 검색한다
--   'XXX 학생의 평균 평점은 x.xx입니다.'
SELECT sname || ' 학생의 평균 평점은' || TO_CHAR(avr, '999.99') ||' 입니다.'
FROM student;
--2. 교수의 다음 형식으로 부임일을 검색한다
--   'XXX 교수의 부임일은 YYYY년 MM월 DD일입니다.'
SELECT pname ||' 교수의 부임일은 '|| TO_CHAR(hiredate, 'YYYY"년" MM"월" DD"일입니다."')
FROM professor;

--3. 교수 중에 3월에 부임한 교수의 명단을 검색한다.
SELECT pno, pname, section, hiredate
FROM professor
WHERE TO_CHAR(hiredate, 'MM')='03';