-TO_CHAR
변환함수
TO_CHAR : 숫자 -> 문자, 날짜 -> 문자
TO_NUMBER : 문자 -> 숫자
TO_DATE : 문자 -> 날짜
TO_CHAR : 숫자 -> 문자, 날짜 -> 문자
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM dual;
SELECT TO_CHAR(SYSDATE,'YYYY년 MM월 DD일') FROM dual; --에러
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual;
숫자 포멧팅.
실제자리수와 일치
SELECT TO_CHAR(1234,9999) FROM dual;
SELECT TO_CHAR(1234,'9999') FROM dual; --9는 숫자 형태든 문자 형태든 상관이없다.
SELECT TO_CHAR(1234,0000) FROM dual;
SELECT TO_CHAR(1234,'0000') FROM dual; -- 0은 문자 형태만 가능하다.
자리수가 모자람 -> ####
SELECT TO_CHAR(1234,999) FROM dual;
SELECT TO_CHAR(1234,'999') FROM dual;
SELECT TO_CHAR(1234,'000') FROM dual;
실제 자리수 보다 많은 자리수 지정
SELECT TO_CHAR(1234,99999) FROM dual;--앞자리에 공백이 생긴다.
SELECT TO_CHAR(1234,'99999') FROM dual;
SELECT TO_CHAR(1234,'00000') FROM dual; --앞자리에 0이 생긴다.
소수점 자리 지정
SELECT TO_CHAR(1234,9999.99) FROM dual;
SELECT TO_CHAR(1234,'9999.99') FROM dual;
SELECT TO_CHAR(1234,'0000.00') FROM dual;
반올림해서 소수점 둘째자리까지 표시
SELECT TO_CHAR(25.897, '99.99') FROM dual;
인상된 급여를 소수점 첫째자리까지 표시
SELECT TO_CHAR(sal*1.15, '9,999.9') FROM emp;
통화 표시
SELECT TO_CHAR(1234,'$0000') FROM dual;
지역 통화 표시 -> L
SELECT TO_CHAR(1234,'L0000') FROM dual;
-TO_NUMBER
TO_NUMBER : 문자 -> 숫자
SELECT TO_NUMBER('100',999) FROM dual;
포맷 형식 생략 가능
SELECT TO_NUMBER('100') FROM dual;
-TO_DATE
TO_DATE : 문자 -> 날짜
SELECT TO_DATE('24-03-12','YYYY-MM_DD') FROM dual; --날짜로 인식했기 때문에 YYYY를 썼어도 결과에는 24(2자리)로 나온다. why? -나 /를 쓰면 포멧레터(YYYY-MM_DD)가 생략가능하기 때문이다.
포맷형식 생략 가능
SELECT TO_DATE ('24-03-12') FROM dual; -- 하이픈과 슬레쉬를 써야된다.
실습문제
[실습문제]
1) emp 테이블의 사원명과 업무를 쉼표(,)로 연결해서 표시하고 컬럼명은 Employee and Job으로 표시하시오.
SELECT (ename || ',' || job) "Employee and Job" FROM emp;
2) 부서번호 30(deptno)에서 근무하며 월 2,000달러 이하를 받는 81년 5월 1일 이전에 입사한 사원의 이름, 급여, 부서번호, 입사일을 출력하시오.
SELECT ename,sal,hiredate FROM emp WHERE deptno = '30' AND (sal <2000 AND hiredate <'81/05/01');
3) emp 테이블에서 이름에 A와 E가 있는 모든 사원의 이름을 표시하시오.
SELECT ename FROM emp WHERE ename LIKE '%A%' AND ename LIKE '%E%';
4) emp 테이블에서 사원이름 중 S가 포함되지 않은 사람들 중 부서번호가 20인 사원들의 이름과 부서번호를 출력하시오.
SELECT ename,deptno FROM emp WHERE ename NOT LIKE '%S%' AND deptno =20;
5) emp 테이블에서 관리자(mgr)가 없는 모든 사원의 이름과 업무를 표시하시오.
SELECT ename,job FROM emp WHERE mgr IS NULL;
6) emp 테이블에서 커미션 항목이 입력된 사원들의 이름과 급여, 커미션을 구하시오.
SELECT ename,sal,comm FROM emp WHERE comm IS NOT NULL;
7) 이름의 글자수가 6자 이상인 사원의 이름을 소문자로 이름만 출력하시오.
SELECT LOWER(ename) FROM emp WHERE LENGTH(ename) >=6;
8) 이름의 글자수가 6자이상인 사람의 이름을 앞에서 3자만 구하여 소문자로 출력하시오.
SELECT LOWER(SUBSTR(ename,1,3)) FROM emp WHERE LENGTH(ename) >=6;
9) 각 사원의 이름을 표시하고 근무 달 수(입사일로부터 현재까지의 달 수)를 계산하여 열레이블을 MONTHS_WORKED로 지정하십시오. 결과는 정수로 반올림하여 표시하고 근무 달 수를 기준으로 오름차순으로 정렬하시오.
SELECT ename, ROUND(MONTHS_BETWEEN(SYSDATE , hiredate)) "MONTHS_WORKED" FROM emp ORDER BY "MONTHS_WORKED" ASC;
10) emp 테이블에서 이름(소문자로 표시), 업무, 근무연차를 출력하시오.
SELECT LOWER(ename),job, ROUND(MONTHS_BETWEEN(SYSDATE , hiredate)/12) FROM emp;
SELECT LOWER(ename),job, EXTRACT(YEAR FROM SYSDATE) -EXTRACT(YEAR FROM hiredate) FROM emp;