oracle SQL - 데이터 유형의 변환 (TO_CHAR)
저장된 데이터에 대하여 내부적으로 다른 유형의 데이터로 변환하여 사용하는 경우가 있다. 이 경우 오라클 서버는 해당 데이터 유형을 자동 변환하기도 하고 사용자에 의해 명시적으로 수행 될 수 있다.
오라클 서버에 의해 자동으로 수행되는 데이터 유형 변환을 암시적 변환 (implicit),
사용자에 의해 수행되는 데이터 유형 변환은 명시적 데이터 유형 변환(explicit)이라고 한다.
암시적 변환의 예시는
select salary 급여
from y_emp
where dept_id = '100';
위 같은 쿼리 실행 시 where절의 '100'을 자동으로 숫자로 형변환해서 실행한다.
TO_CHAR(), TO_NUMBER(), TO_DATE() 와 같은 함수를 사용하여 형변환을하면 명시적 데이터 유형 변환에 해당된다.
TO_CHAR
TO_CHAR([숫자 | 날짜], 'format_model')
to_char 함수의 두 번째 인수는 출력될 데이터의 형식을 지정한 것.
1. 첫 번째 인수가 숫자인 경우 지정할 수 있는 형식 요소
형식 | 설명 |
9 | 실제 자릿수를 나타냄 |
0 | 전체 자릿수를 나타냄. 빈 자리는 강제로 0 |
$ | $기호를 강제로 추가한다. |
L | 해당 지역의 통화기호를 추가한다. |
, (쉼표) | 천 단위 구분기호를 표시 |
. (마침표) | 소수점을 표시 |
select emp_id, emp_name, TO_CHAR(salary * 12, 'L99,999.00') annual_salary
from y_emp
where dept_id = 100;
급여에 12를 곱한 결과를 우리나라 통화기호를 추가하고 실제 자릿수를 나타낸다.

만약 우리나라 통화기호가 아닌 달러를 쓰는 나라가 아닌 나라의 통화기호를 사용하고 싶으면
ALTER SESSION set nls_territory = japan;
위 쿼리문과 같이 나라를 수정 해주면 된다.

3 ~ 6행은 형식모델 9를 사용하여 만의 자리가 없기 때문 자연스럽게 출력되지만
형식모델 0을 사용하면 만의 자리가 빈 자리로 판단해 0을 강제로 집어 넣어버린다.
select emp_id, emp_name, TO_CHAR(salary * 12, 'L09,999.00') annual_salary
from y_emp
where dept_id = 100;

2. 첫 번째 인수가 날짜인 경우 지정할 수 있는 형식 요소는 다음과 같다.

부서 번호가 200번이면서 입사일을 yyyy-mm 형식으로 표시하고자 할 땐 다음과 같이 작성한다.
select emp_id, emp_name, TO_CHAR(hiredate, 'yyyy-mm') hiredate
from y_emp
where dept_id = 200;

3. DB 테이블에 행 삽입시 시간에 대한 정보가 없다면 TO_CHAR() 함수를 통해 날짜 데이터를 시간과 함께 보고싶어도 00시00분00초가 기본값으로 나온다. (date 타입의 특징)

4. yyyy or yy : 두 자리 또는 네 자리로 연도 표시


5. year : 영어로 연도 표시

6. month : 달의 이름 (문자)

7. mon : 약어 (영어)

8. mm : 숫자 두 개

9. day : 요일 전체 이름

10. dy : 약어로 표시 (sun, mon, 월, 화 등등..)

11. ddd : 1월 1일 기준 며칠 지났는지

12. dd : 일반적인 2자리

13. d : 이번주 기준 며칠

오라클은 "1 : 일요일 ~ 7 : 토요일"을 뜻한다.
14. ww : 올해 몇주차

2023년 기준 3월 28일은 13주차이다.
15. w : 이번 달 몇 주차

2023년 3월 28일은 4주차이다.
16. q : 분기

아직 2023년 3월이므로 1분기이다.
17. AM, PM : 오전, 오후를 표시한다.(대소문자 상관 x)


18. fm : 앞자리 0을 제거한다
예시) 08년도 01월 01일을 출력하면 8/1/1로 출력된다.

앞에 붙은 0이 제거됨