hyeonga_code
Database_20_변환 함수_TO_CHAR, TO_NUMBER, TO_DATE, RR 본문
-- SQL 함수
-- 변환 함수
-- 데이터 타입을 변환할 수 있는 함수입니다.
-- Implicit_암시적 데이터 유형 변환
-- 프로그램이 자동으로 형을 변환해줍니다.
-- Explicit_명시적 데이터 유형 변환
-- 날짜
-- 문자
-- 숫자
-- 숫자 >'TO_CHAR'> 문자 >'TO_NUMBER'> 숫자
-- 날짜 >'TO_CHAR'> 문자 >'TO_DATE'> 날짜
-- 숫자와 날짜 사이의 변환은 없습니다.
-- 암시적
SELECT last_name, RPAD(last_name, 15, '*') AS ename, LPAD(salary, 10, '*') AS salary
FROM employees
WHERE department_id IN (50, 60);
/*
LAST_NAME ENAME SALARY
-------------------------------------------------------------
Hunold Hunold********* ******9000
Ernst Ernst********** ******6000
Lorentz Lorentz******** ******4200
Mourgos Mourgos******** ******5800
Rajs Rajs*********** ******3500
Davies Davies********* ******3100
Matos Matos********** ******2600
Vargas Vargas********* ******2500
-- 숫자에는 특수문자를 붙일 수 없습니다.
-- 자동으로 문자열로 변환하여 *를 붙일 수 있습니다.
*/
SELECT last_name, salary FROM employees
WHERE salary > '10000';
/*
LAST_NAME SALARY
------------------------------------
King 24000
Kochhar 17000
De Haan 17000
Zlotkey 10500
Abel 11000
Hartstein 13000
Higgins 12000
*/
SELECT last_name, salary FROM employees
WHERE salary > '$10,000';
-- 시스템이 숫자로 인식할 수 없어 자동으로 형 변환이 어렵습니다.
-- TO_CHAR 함수
-- 날짜 데이터
-- Format Model
-- 작은 따옴표로 묶어야 합니다.
-- 대소문자를 구분합니다.
-- 모든 유효한 날짜 형식 요소를 포함할 수 있습니다.
-- 채워진 공백을 제거하거나 선행 제로를 제거하는 fm 요소가 있습니다.
-- 쉼표로 날짜 값과 구분합니다.
-- 날짜 형식
-- yyyy / RRRR : 연도
-- MM : 두자리 숫자 값으로 나타낸 달입니다.
-- MONTH: 월 전체 이름
-- MON : 세 자의 약어로 나타낸 월 이름
-- DAY : 요일 전체 이름
-- DY : 세 자의 약어로 나타낸 요일 이름
-- DD : 숫자로 나타낸 달의 일
-- Q : 숫자로 나타낸 분기
-- 영어권에서는 대소문자를 구분하여 형식이 다르게 출력됩니다.
-- 시간 형식
-- HH : 시간 1-12
-- HH24 : 시간 0-23
-- MI : 분 0-59
-- SS : 초 0-59
-- AM/PM : 오전/오후 표시
SELECT sysdate FROM dual;
SELECT TO_CHAR(sysdate, 'yyyy/mm/dd hh24:mi:ss'), TO_CHAR(sysdate, 'FMyyyy/mm/dd'), TO_CHAR(sysdate, 'yyyy/mm/dd hh:mi:ss PM dy q w ww')
FROM dual;
/*
TO_CHAR('...') TO_CHAR('...') TO_CHAR('...')
---------------------------------------------------------------------------------------------------
2023/07/03 10:35:24 2023/7/3 2023/07/03 10:40:38 오전 월 3 1 27
*/
SELECT TO_CHAR(sysdate, 'FMyyyy/mm/dd hh24:mi:ss'), TO_CHAR(sysdate, 'fmyyyy/mm/dd hh:mi:ss PM dy q w ww')
FROM dual;
SELECT TO_CHAR(sysdate, 'q')
FROM dual;
/*
TO_CHAR(sysdate, 'q')
------------------------
3
*/
SELECT last_name, hire_date, TO_CHAR(hire_date, 'yyyy'), EXTRACT(year FROM hire_date)
FROM employees;
/*
L_NAME HIRE_DATE TO_CHAR(h, '...') EXTRACT(year FROM h)
---------------------------------------------------------------------------------------------
King 02/06/17 2002 2002
Kochhar 04/09/21 2004 2004
De Haan 08/01/13 2008 2008
Hunold 05/01/03 2005 2005
Ernst 06/05/21 2006 2006
...
- TO_CHAR : 문자열 반환
- EXTRACT : 날짜 형식으로 반환
*/
-- 숫자 데이터
-- FORMAT MODEL
-- 9 : 숫자를 표시합니다.
-- 0 : 자릿수를 0으로 채워 표시합니다.
-- $ : 부동통화기호를 표시
-- L : 지역 통화 기호 표시 (ALTER SESSION SET nls_territory=??)
-- . : 소수점
-- , : 천 단위 구분 기호
SELECT last_name, salary, TO_CHAR(salary, '$999,999'), TO_CHAR(salary, '$00,000'), TO_CHAR(salary, 'L99,999')
FROM employees;
/*
L_NAME SALARY T(..., '$999,999') T(..., '$00,000') T(..., 'L99,999')
----------------------------------------------------------------------------------------------------------
King 24000 $24,000 $24,000 \24,000
Kochhar 17000 $17,000 $17,000 \17,000
De Haan 17000 $17,000 $17,000 \17,000
Hunold 9000 $9,000 $09,000 \9,000
...
*/
-- L : 지역에 따라 통화 기호가 변경되어 출력됩니다.
-- 일본 통화
ALTER SESSION SET nls_territory=japan;
SELECT last_name, TO_CHAR(salary, 'L99,999')
FROM employees;
/*
LAST_NAME TO_CHAR(salary, 'L99,999')
----------------------------------------------------------
King ¥24,000
...
*/
-- 독일 통화
ALTER SESSION SET nls_territory=germany;
SELECT last_name, TO_CHAR(salary, 'L99,999')
FROM employees;
/*
LAST_NAME TO_CHAR(salary, 'L99,999')
------------------------------------------------------------
King €24,000
...
*/
-- 다시 한국으로 지역을 변경합니다.
ALTER SESSION SET nls_territory=korea;
SELECT sysdate, systimestamp FROM dual;
-- systimestamp : 변환을 하지 않아도 자세하게 조회할 수 있습니다.
-- TO_NUMBER 함수
-- 문자열을 숫자 형식으로 변환합니다.
SELECT last_name
FROM employees
WHERE salary > TO_NUMBER('$10,000', '$99,999');
/*
LAST_NAME
---------------
King
Kochhar
De Haan
...
*/
-- TO_DATE 함수
-- 문자열을 날짜 형식으로 변환합니다.
SELECT last_name, hire_date
FROM employees
WHERE hire_date > TO_DATE('01 01 10' , 'DD MM YY');
/*
LAST_NAME HIRE_DATE
---------------------------------------------
Lorentz 14/02/07
Mourgos 14/11/16
Rajs 10/10/17
...
*/
-- 오늘 날짜와 다른 세기의 연도가 조건이 되는 경우 YY 두자리로 검색할 수 없습니다.
SELECT last_name, hire_date
FROM employees
WHERE hire_date > TO_DATE('01 01 99' , 'DD MM YY');
-- 조회되지 않습니다.
-- RR
/*
------------------------------+-----------------------------------------------------------
구 지정 연도(두자리)
+-------------------------------+---------------------------
분 0-49 50-99
----------------+------------+-------------------------------+----------------------------
현재 연도 0-49 반환일이 현재 세기 반환일이 이전 세기
(두 자리) 50-99 반환 일이 다음 세기 반환일이 현재 세기
----------------+------------+-------------------------------+----------------------------
*/
SELECT last_name, hire_date
FROM employees
WHERE hire_date > TO_DATE('01 01 99' , 'DD MM RR');
/*
LAST_NAME HIRE_DATE
-------------------------------------
King 02/06/17
Kochhar 04/09/21
De Haan 08/01/13
...
*/
-- 변환 함수의 응용
-- 집합 연산 시, SELECT 목록에 있는 표션식의 개수를 일치시키기 위해 데이터 유형 변환 함수를 사용할 수 있습니다.
SELECT department_id, TO_NUMBER(null) AS location, hire_date
FROM employees
UNION
SELECT department_id, location_id, TO_DATE(null)
FROM departments;
-- TO_NUMBER(null)을 사용하여 location_id와 일치하는 숫자를 생성합니다.
-- TO_DATE(null)을 사용하여 hire_date와 일치하는 문자열을 생성합니다.
-- 둘 다 기본 값은 null로 생성됩니다.
/*
DEPARTMENT_ID LOCATION HIRE_DATE
-----------------------------------------------------------------
10 1700 ( null )
10 ( null ) 02/09/17
20 1800 ( null )
20 ( null ) 11/02/17
...
*/
'Oracle Database' 카테고리의 다른 글
Database_22_일반 함수_함수의 중첩 (0) | 2023.07.25 |
---|---|
Database_21_일반 함수_NVL, NVL2, COALESCE (0) | 2023.07.24 |
Database_19_날짜 함수_ROUND, TRUNC (0) | 2023.07.22 |
Database_18_날짜 함수_MONTH_BETWEEN, ADD_MONTH, NEXT_DAY, LAST_DAY, EXTRACT (0) | 2023.07.21 |
Database_17_날짜 함수_SYSDATE, CURRENT_DATE, SYSTIMESTAMP, CURRENT_TIMESTAMP (0) | 2023.07.20 |