DataBase

2022-11-22 데이터 베이스 오라클 : 변환함수

헤니s 2022. 11. 22. 13:47

변환함수
  - 자료의 형을 일시적으로 변환하기 위한 함수
  - TO_CHAR(숫자나 날짜를 문자로), 

    TO_NUMBER(문자나 날짜를 숫자로), 

    TO_DATE(문자를 날짜 데이터로 변환),

    CAST(바꾸고싶은대로 바꿈) 제공


 1. CAST(expr  AS 타입명) -- 기본형으로밖에 밖을수 없음
    . 'expr'형을 '타입명'으로 변환
    . 물리적으로 변환되지는 않음
    
    -- 변환하고자 하는 새로운 데이터 타입으로 출력
    
    

사용예) 2020년 6월 일자별 판매집계를 조회하시오.

SELECT CAST(SUBSTR(A.CART_NO,1,8) AS DATE) AS 일자,
 -- 날짜형식으로 바꿈(형변환)
       SUM(A.CART_QTY) AS 판매수량,
       SUM(A.CART_QTY*B.PROD_PRICE) AS 판매금액
  FROM CART A, PROD B
 WHERE A.CART_PROD=B.PROD_ID
 GROUP BY CAST(SUBSTR(A.CART_NO,1,8) AS DATE)
 ORDER BY 1;

 


 2. TO_CHAR(expr [, fmt])
   - 문자열(CHAR, CLOB -> VARCHAR2), 숫자, 날짜 타입의 데이터를 'fmt' 형식에 맞는 
     문자열 자료로 형변환 -- 특정한 경우 문자열을 문자열로 바꿀수 있다. 

     (예 -고정길이 문자열 -> 가변길이 문자열)
   - format 문자열은 날짜와 숫자로 구분

 

 

 

 

** 날짜 format string

더보기

-----------------------------------------------------------------------------------
    format                          기능                          예
-----------------------------------------------------------------------------------
    CC                               세기                    SELECT TO_CHAR(SYSDATE, 'CC') FROM DUAL;
    AD, BC                         서기                    SELECT TO_CHAR(SYSDATE, 'AD YYYY') FROM DUAL; 
    YYYY,YYY,YY,Y           년도                    SELECT TO_CHAR(SYSDATE, 'YYYY'),
                                                                                   TO_CHAR(SYSDATE, 'YYY'),
                                                                                   TO_CHAR(SYSDATE, 'YY'),
                                                                                   TO_CHAR(SYSDATE, 'Y') FROM  DUAL;


    Q                                 분기                   SELECT TO_CHAR(SYSDATE, 'YYYY/MM Q') FROM DUAL;

                                                                  -- 2022/11/4분기
    MM, RM                       월                      SELECT TO_CHAR(SYSDATE, 'MM'),
                                                                                 TO_CHAR(SYSDATE, 'RM'),
                                                                                 TO_CHAR(SYSDATE, 'MONTH'),
                                                                                 TO_CHAR(SYSDATE, 'MON') FROM DUAL;  
    MONTH, MON         '월'문자열 

                                     추가 출력     
    WW,                         년의 주수, 

      W                           월의 주수              SELECT TO_CHAR(SYSDATE, 'WW'),
                                                                 TO_CHAR(SYSDATE, 'W')  FROM DUAL;  
    DDD,DD,D           년의 일,월의 일,

                                 주의 일                    SELECT TO_CHAR(SYSDATE, 'DDD'),   
                                                                                TO_CHAR(SYSDATE, 'DD'),   
                                                                                TO_CHAR(SYSDATE, 'D'),  
                                                                                TO_CHAR(SYSDATE, 'DAY'),
                                                                                TO_CHAR(SYSDATE, 'DY') FROM DUAL;    
                                                     
    DAY,DY             요일  -- 수요일 / 수(약자)
    AM, PM, A.M        오전, 오후              SELECT TO_CHAR(SYSDATE, 'AM'),
                                                                              TO_CHAR(SYSDATE, 'P.M.')  FROM DUAL; 
                                                     
    P.M.               --  SYSDATE를 받으면 아무리 P.M.을 선언해도 오전이면 오전이라고 표기된다.
    HH,HH12,HH24       시간
    MI                             분
    SS,SSSSS               초                     SELECT TO_CHAR(SYSDATE, 'HH:MI:SS'),
                                                                            TO_CHAR(SYSDATE, 'HH12:MI:SSSSS'),  
                                                                            TO_CHAR(SYSDATE, 'HH24:MI:SS')  
                                                                            FROM DUAL;




    "사용자정의 문자열"         

    SELECT TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일"') FROM DUAL;                                                                 
    >> 2022년 11월 23일


-- **    
--  AD, BC 원본데이터가 이미 저장되어있어서 둘다 '서기'로 표시됨
--  RM 로마자로 월 표기
--  MONTH(월의 풀네임), MON(월의 약자 - JUN,DEC) /한글은 월을 표현하는 약자가 없어서 같은 형식으로 출력됨
--  1년 52주/WW 오늘이1년의 몇 주 차인지/ W 이번달에 오늘은 몇주차인지
--  (11월 23일 WW : 오늘은 1년의 47주차/W : 11월의 4주차)
--   DDD : 날짜가 3자리로 표현한다. => 1월 1일부터 오늘까지 경과된 일 
--   DD : 2자리로 표현 이번달 1일부터 오늘까지 경과된 일,
--   D  : 이번주의 월요일부터 오늘까지 경과된 일  
--  HH = HH12 : 12시간 형식,HH24 : 24시간 형식
--  SS : 1분은 60초 / SSSSS : 5자리로 표기함 : 오늘 0시0초부터 시작해서 지금까지 경과된 초를 출력

 

 

 


** 숫자 format string

사용예) -- 결과는 숫자가 아닌 문자열!!
SELECT TO_CHAR(12345,'999,999'),     --  12,345     /나인모드
       TO_CHAR(12345,'000,000'),     --  012,345
       TO_CHAR(12345,'999,999.99'),  --  12,345.00  /나인모드여도 소숫점0출력
       TO_CHAR(12345,'999,999.00'),  --  12,345.00
       TO_CHAR(-12345,'999,999MI'),  --  12,345-    / 음수부호가 오른쪽에 표기
       TO_CHAR(-12345,'999,999PR'),  --  <12,345>   / 음수인경우 < 숫자 > 표기 / 양수인경우 일반숫자 표기
       TO_CHAR(12345,'L999,999'),    --  ₩12,345   / Location의 'L'
       TO_CHAR(12345,'$000,999')     --  $012,345   / 달러표기와 제로모드
 FROM DUAL

 

더보기

-----------------------------------------------------------------------------------
    format                                        기능                              
-----------------------------------------------------------------------------------
    9                                        유효숫자출력, 무효의                       
                                              0은 공백 처리
    0                                        유효숫자출력, 무효의 
                                              0은 '0' 출력
    $,L                                     화폐기호 출력 -- 맨왼쪽에 출력
    MI                                     음수인 경우 우측에 '-'출력--( 1234-)
    PR                                    음수인 경우 우측에 < >안에 출력
    ,(Comma)                         3자리마다 자리점 출력
    .(DOT)                              소숫점 출력

 

 


/* 나인모드         제로모드            
** 01234.30        01234.30
   99,999.99       00,000.00
-------------------------------- 유효숫자 출력
   1,234           01,234.30
   0공백처리         0 출력
(소숫점은 0출력)

 화폐 기호 : $ 1,234   / L 1,234 L: 다른나라 화폐기호 */
 


  

   SELECT TO_CHAR('345') + 9999  -- 실행됨 : 10344
     FROM DUAL; 
      
   SELECT TO_CHAR('1,344') + 9999  -- 실행불가 : 1,344 => 콤마 때문에 
     FROM DUAL;

 

 

사용예) 

    SELECT TO_DATE('20211230'), -- 숫자가 날짜로 바뀜
           TO_DATE(20211230),   -- 숫자가 날짜로 바뀜
           TO_DATE('20211230','YYYY-MM-DD'),  -- 'YYYY-MM-DD' 여도 == 2021/12/30 표기
           TO_CHAR(TO_DATE('20211230095023','YYYYMMDDHH24MISS'),'YYYY-MM-DD HH24:MI:SS')
           -- 날짜타입으로 변경 => TO_CHAR로 YYYY-MM-DD 형식으로 표기
      FROM DUAL;


           
사용예)'2022.08.25'를 날짜형식으로 변환하고 10일 후의 날짜와 해당월의 마지막 날짜를 구하시오

    SELECT TO_DATE('2022.08.25','YYYY/MM/DD'),          -- 2022/08/25
           TO_DATE('2022.08.25','YYYY/MM/DD') + 10,     -- 2022/09/04
           LAST_DAY(TO_DATE('2022.08.25','YYYY/MM/DD')) -- 2022/08/31
      FROM DUAL;
           
    
    SELECT TO_DATE('2022년 08월 25일','YYYY/MM/DD'),  -- 에러남
           TO_DATE('2022 08 25','YYYY/MM/DD') + 10,     -- 2022/09/04
           LAST_DAY(TO_DATE('2022.08.25','YYYY/MM/DD')) -- 2022/08/31
      FROM DUAL; 
      
  
    --  출력되기 위해서     형식지정문자열을 기술해줘야함
    SELECT TO_DATE('2022년 08월 25일','YYYY"년" MM"월" DD"일"') + 5, -- 2022/08/30
           TO_DATE('2022 08 25','YYYY/MM/DD') + 10,                 -- 2022/09/04
           LAST_DAY(TO_DATE('2022.08.25','YYYY/MM/DD'))             -- 2022/08/31
      FROM DUAL;

    
 4. TO_NUMBER(expr [, fmt])
   - 문자열 데이터 expr을 숫자 타입으로 형을 변환 시킴
   - 'expr'은 반드시 숫자로 변환 가능해야하며 숫자로 변환할 수 없는 문자열이 포함된 경우
     'expr'이 출력되기 위해 요구되는 형식지정문자열을 기술해야 함.
   - 'fmt'은 TO_CHAR에 사용된 숫자 format string과 같다.
   

 

   
사용예)

    SELECT TO_NUMBER('12345'),
           TO_NUMBER('1234.08') FROM DUAL; 
    -- 소숫점은 별도의 형식없이 그냥 숫자로 변환됨
    
           
    SELECT TO_NUMBER('12,345'),   -- 콤마 사용으로 에러남
                   TO_NUMBER('12,345.08') FROM DUAL;       

    SELECT TO_NUMBER('12,345','99,999'),    
           TO_NUMBER('12,345.08','99,999.99') FROM DUAL;  
     -- 콤마를 사용하려면 '99,999'의 사용자지정형식 사용       
     -- 기본숫자열 '12345' 로 표기됨  
           

    SELECT TO_NUMBER('<12,345>','99,999PR'),   -- 음수 '-12,345'
           TO_NUMBER('₩12,345.08', 'L99,999.00') FROM DUAL;   
            -- 원본숫자 '12345.08' 로 표기됨