hyeonga_code

Database_20_변환 함수_TO_CHAR, TO_NUMBER, TO_DATE, RR 본문

Oracle Database

Database_20_변환 함수_TO_CHAR, TO_NUMBER, TO_DATE, RR

hyeonga 2023. 7. 23. 05:59
반응형

-- 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
    ...

    */


    

반응형