본문 바로가기

DB

0920 DB - 형식문자

728x90
반응형

목차

     

    시간 형식문자

    • HH : 12시간 제의 시간(HOUR)값을 숫자로 표현(HH12와 동일)
    • HH12 : 12시간 제의 시간(HOUR)값을 숫자로 표현
    • HH24 : 24시간 제의 시간(HOUR)값을 숫자로 표현
    • MI : 분(MINUTE)값을 숫자로 표현
    • SS : 초(SECOND)값을 숫자로 표현
    • AM|PM : 오전/오후 구분자 AM/PM 둘 다 사용가능
    SELECT sysdate+8/24,
    TO_CHAR(sysdate+8/24, 'HH / HH12 / HH24')
    FROM dual;
     
    SYSDATE+8/24           |TO_CHAR(SYSDATE+8/24,'HH/HH12/HH24')|
    
    -----------------------+------------------------------------+
    
    2022-09-14 18:34:32.000|06 / 06 / 18                        |

     

    SELECT sysdate+8/24,
    TO_CHAR(sysdate+8/24, 'HH24:MI:SS AM PM')
    FROM dual;
    
    
    //////////////////////////////////////////////////////////////////
    
    
    SYSDATE+8/24           |TO_CHAR(SYSDATE+8/24,'HH24:MI:SSAMPM')|
    
    -----------------------+--------------------------------------+
    
    2022-09-14 18:38:57.000|18:38:57 오후 오후                        |
    SELECT TO_CHAR(sysdate+8/24, 'YYYY-MM-DD HH24:MI:SS')
    FROM dual;
    
    /////////////////////////////////////////////////////
    
    TO_CHAR(SYSDATE+8/24,'YYYY-MM-DDHH24:MI:SS')|
    
    --------------------------------------------+
    
    2022-09-14 18:42:38                         |

     

    리터럴 문자 활용

    • 날짜 데이터의 요소 출력시 리터럴 문자를 포함하여 문장을 작성하고 싶은 경우 리터럴 문자의 내용을 큰따옴표("")로 묶어서 형식문자 사이에 입력하여 사용할 수 있다.
     
    SELECT TO_CHAR(sysdate+8/24, '"오늘은 "YYYY"년도 "MM"월 "DD"일 이다."')
    FROM dual;
    TO_CHAR(SYSDATE+8/24,'"오늘은"YYYY"년도"MM"월"DD"일이다."')|
    
    --------------------------------------------------+

     

    오늘은 2022년도 0914일 이다.                            |



     
    SELECT last_name || ' ' || TO_CHAR(hire_date, '"입사일은 "YYYY"년도 "MM"월 "DD"일 이다."')
    FROM employees;
    LAST_NAME||''||TO_CHAR(HIRE_DATE,'"입사일은"YYYY"년도"MM"월"DD"일이다."')|
    
    ---------------------------------------------------------------+
    
    King 입사일은 2003년도 06월 17일 이다.                                   |
    
    Kochhar 입사일은 2005년도 09월 21일 이다.                                |
    
    De Haan 입사일은 2001년도 01월 13일 이다.                                |
    
    Hunold 입사일은 2006년도 01월 03일 이다.                                 |
    
    Ernst 입사일은 2007년도 05월 21일 이다.                                  |
    
    Austin 입사일은 2005년도 06월 25일 이다.                                 |
    
    Pataballa 입사일은 2006년도 02월 05일 이다.                              |
    
    Lorentz 입사일은 2007년도 02월 07일 이다.                                |
    
    Greenberg 입사일은 2002년도 08월 17일 이다.                              |
    
    …


    접미어 sp, th

    • sp : 숫자값을 스펠링형태로 출력하는 접미어
    • th : 서수 표기법으로 결과를 출력

     

     
    SELECT TO_CHAR(sysdate, 'dd'),
    TO_CHAR(sysdate, 'ddsp'), TO_CHAR(sysdate, 'ddth'), TO_CHAR(sysdate, 'ddspth')
    FROM dual;
    TO_CHAR(SYSDATE,'DD')|TO_CHAR(SYSDATE,'DDSP')|TO_CHAR(SYSDATE,'DDTH')|TO_CHAR(SYSDATE,'DDSPTH')|
    
    ---------------------+-----------------------+-----------------------+-------------------------+
    
    14                   |fourteen               |14th                   |fourteenth               |

     

     

     

     

     

     
    SELECT TO_CHAR(sysdate-13, 'dd'),
    TO_CHAR(sysdate-13, 'ddsp'), TO_CHAR(sysdate-13, 'ddth'), TO_CHAR(sysdate-13, 'ddspth')
    FROM dual;
    TO_CHAR(SYSDATE-13,'DD')|TO_CHAR(SYSDATE-13,'DDSP')|TO_CHAR(SYSDATE-13,'DDTH')|TO_CHAR(SYSDATE-13,'DDSPTH')|
    
    ------------------------+--------------------------+--------------------------+----------------------------+
    
    01                      |one                       |01st                      |first                       |

     

     

     

     

     
    SELECT TO_CHAR(sysdate, 'year'),
    TO_CHAR(sysdate, 'yyyysp')
    FROM dual;
    TO_CHAR(SYSDATE-10,'YEAR')|TO_CHAR(SYSDATE-10,'YYYYSP')|
    
    --------------------------+----------------------------+
    
    twenty twenty-two         |two thousand twenty-two     |

     

     


    형식문자의 대소문자

    • 형식문자의 대소문자형태에 따라 영문자로 출력되는 결과의 대소문자도 달라진다.
     
    SELECT TO_CHAR(sysdate, 'YEAR'), TO_CHAR(sysdate, 'Year'), TO_CHAR(sysdate, 'year')
    FROM dual;
    TO_CHAR(SYSDATE,'YEAR')|TO_CHAR(SYSDATE,'YEAR')|TO_CHAR(SYSDATE,'YEAR')|
    
    -----------------------+-----------------------+-----------------------+
    
    TWENTY TWENTY-TWO      |Twenty Twenty-Two      |twenty twenty-two      |

     

     

     

    • 기본적으로 MM과 같은 형식문자는 숫자값으로 결과를 출력하므로 대소문자의 영향이 없으나 접미어 sp를 더해서 영문자로 변환하는 경우 형식문자의 대소문자가 출력 결과에도 영향을 미치게 된다.
     
    SELECT TO_CHAR(sysdate, 'MMsp'), TO_CHAR(sysdate, 'Mmsp'), TO_CHAR(sysdate, 'mmsp')
    FROM dual;
    TO_CHAR(SYSDATE,'MMSP')|TO_CHAR(SYSDATE,'MMSP')|TO_CHAR(SYSDATE,'MMSP')|
    
    -----------------------+-----------------------+-----------------------+
    
    NINE                   |Nine                   |nine                   |

     

     

     

     

    접두어 fm

    • fm : 숫자값을 출력하는 형식문자앞에 사용하는 요소로 해당 숫자값에서 자리값을 채우는 목적의 0을 제거하여 출력할 때 사용한다. ex) DD → fmDD : 06 → 6
     
    SQL> SELECT last_name, TO_CHAR(hire_date, 'fmDD Month YYYY')
      2  AS HIREDATE
      3  FROM employees;

     

    LAST_NAME                 HIREDATE
    
    ------------------------- --------------------------------------------
    
    King                      17 June 2003
    
    Kochhar                   21 September 2005
    
    De Haan                   13 January 2001
    
    Hunold                    3 January 2006
    
    Ernst                     21 May 2007
    
    Austin                    25 June 2005
    
    Pataballa                 5 February 2006
    
    Lorentz                   7 February 2007
    
    Greenberg                 17 August 2002
    
    Faviet                    16 August 2002
    
    Chen                      28 September 2005
    
    …

     

     

     

     

     

     

    시간에 대한 숫자값이나 영문자로 출력되는 값의 경우 접두어fm은 동작하지 않는다.

     
    SQL> SELECT last_name, TO_CHAR(hire_date+1/24, 'fmDdspth "of" Month YYYY fmHH:MI:SS AM') AS hiredate
      2  FROM employees;

     

    LAST_NAME                 HIREDATE
    
    ------------------------- --------------------------------------------------
    
    King                      Seventeenth of June 2003 01:00:00 AM
    
    Kochhar                   Twenty-First of September 2005 01:00:00 AM
    
    De Haan                   Thirteenth of January 2001 01:00:00 AM
    
    Hunold                    Third of January 2006 01:00:00 AM
    
    Ernst                     Twenty-First of May 2007 01:00:00 AM
    
    Austin                    Twenty-Fifth of June 2005 01:00:00 AM
    
    Pataballa                 Fifth of February 2006 01:00:00 AM
    
    Lorentz                   Seventh of February 2007 01:00:00 AM
    
    Greenberg                 Seventeenth of August 2002 01:00:00 AM
    
    Faviet                    Sixteenth of August 2002 01:00:00 AM
    
    Chen                      Twenty-Eighth of September 2005 01:00:00 AM
    ...

     

    Q. employees테이블에 대해서 사원의 성, 사원의 고용일(hire_date)의 정보를 "Monday, the Thirty-First of July, 2000"의 형식으로 출력되게끔 작성하고 컬럼명을 REVIEW로 출력하는 쿼리구문을 작성하시오.

     

     
    SQL> SELECT last_name, TO_CHAR(hire_date, 'Day", the "Ddspth" of "Month", "YYYY') review
      2  FROM employees;

     

    LAST_NAME                 REVIEW
    
    ------------------------- --------------------------------------------------
    
    King                      Tuesday  , the Seventeenth of June     , 2003
    
    Kochhar                   Wednesday, the Twenty-First of September, 2005
    
    De Haan                   Saturday , the Thirteenth of January  , 2001
    
    Hunold                    Tuesday  , the Third of January  , 2006
    
    Ernst                     Monday   , the Twenty-First of May      , 2007
    
    Austin                    Saturday , the Twenty-Fifth of June     , 2005
    
    Pataballa                 Sunday   , the Fifth of February , 2006
    
    Lorentz                   Wednesday, the Seventh of February , 2007
    
    Greenberg                 Saturday , the Seventeenth of August   , 2002
    
    Faviet                    Friday   , the Sixteenth of August   , 2002
    
    Chen                      Wednesday, the Twenty-Eighth of September, 2005
    ...

     

    Q. employees테이블에 대해서 사원의 성(last_name), 고용일(hire_date), 근무 시작 요일을 DAY라는 이름으로 월요일을 시작으로 정렬된 결과를 출력하는 쿼리구문을 작성하시오.

     

     

    SQL> SELECT last_name, hire_date, TO_CHAR(hire_date, 'DAY') day, TO_CHAR(hire_date-1, 'd')
      2  FROM employees
      3  ORDER BY TO_CHAR(hire_date - 1, 'd');

     

     
    LAST_NAME                 HIRE_DATE DAY                                  T
    
    ------------------------- --------- ------------------------------------ -
    
    Ladwig                    14-JUL-03 MONDAY                               1
    
    Cambrault                 15-OCT-07 MONDAY                               1
    
    Mallin                    14-JUN-04 MONDAY                               1
    
    Ernst                     21-MAY-07 MONDAY                               1
    
    Greene                    19-MAR-07 MONDAY                               1
    
    Banda                     21-APR-08 MONDAY                               1
    
    Walsh                     24-APR-06 MONDAY                               1
    
    Ande                      24-MAR-08 MONDAY                               1
    
    Vollman                   10-OCT-05 MONDAY                               1
    
    Kumar                     21-APR-08 MONDAY                               1
    
    Olson                     10-APR-07 TUESDAY                              2
    
    …

     


    TO_CHAR(NUMBER → CHAR)

    • 숫자데이터를 문자열로 변환하는 함수
    • TO_CHAR(숫자, '형식문자')

     

     

     


    형식문자 '9'

    형식문자의 '9'는 문자로 변환할 한자리의 숫자자리를 의미한다.
    3자리의 숫자를 3자리의 문자열로 변환하는데는 3이상의 형식문자 '9'가 있어야 한다.

     

    • #####으로 깨진것처럼 보이는 값은 함수에서 현재의 형식문자로는 변환할 수 없는 값을 나타낸다.
     
    SELECT salary, TO_CHAR(salary, '9999')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'9999')|
    
    ------+----------------------+
    
     24000|#####                 |
    
     17000|#####                 |
    
     17000|#####                 |
    
      9000| 9000                 |
    
      6000| 6000                 |
    
      4800| 4800                 |
    
      4800| 4800                 |
    
      4200| 4200                 |
    
     12008|#####                 |
    
      9000| 9000                 |
    
    …

     

     

     

    변환할 숫자보다 형식문자의 길이가 더 긴 경우에는 변환에는 문제가 없으나 출력결과의 길이가 형식문자의 길이만큼 공백을 붙여서 출력하게 된다.

     
    SELECT salary, TO_CHAR(salary, '99999999')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'99999999')|
    
    ------+--------------------------+
    
     24000|    24000                 |
    
     17000|    17000                 |
    
     17000|    17000                 |
    
      9000|     9000                 |
    
      6000|     6000                 |
    
      4800|     4800                 |
    
      4800|     4800                 |
    
      4200|     4200                 |
    
     12008|    12008                 |
    
    …

     

     

     

    형식문자 '0'

    숫자값을 형식문자의 길이에 맞춰 변환을 하는 부분은 형식문자 '9'와 같지만 형식문자가 변환될 숫자값보다 길이가 긴 경우 길이가 더 긴만큼 문자 '0'을 붙여서 길이를 맞춰 출력하게 된다.

     

     
    SELECT salary, TO_CHAR(salary, '0000000')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'0000000')|
    
    ------+-------------------------+
    
     24000| 0024000                 |
    
     17000| 0017000                 |
    
     17000| 0017000                 |
    
      9000| 0009000                 |
    
      6000| 0006000                 |
    
      4800| 0004800                 |
    
      4800| 0004800                 |
    
      4200| 0004200                 |
    
    …

     

     

     

     

    형식문자 '0'은 형식문자 중 하나라도 '0' 있다면 공백으로 문자'0'으로 채워서 출력되는 기능이 동작한다.

     
    SELECT salary, TO_CHAR(salary, '099999')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'099999')|
    
    ------+------------------------+
    
     24000| 024000                 |
    
     17000| 017000                 |
    
     17000| 017000                 |
    
      9000| 009000                 |
    
      6000| 006000                 |
    
      4800| 004800                 |
    
      4800| 004800                 |
    
      4200| 004200                 |
    
     12008| 012008                 |
    
      9000| 009000                 |
    
      8200| 008200                 |
    
      7700| 007700                 |
    
      7800| 007800                 |
    
    …

     

     

     

    형식문자 '$'

    부동 통화기호 '$'를 붙여서 문자열을 출력하게 된다.

    통화기호의 위치는 고정이 아닌 문자열로 변환될 숫자값의 길이에 맞춰 왼쪽편에 붙어 옮겨다니는 형태로 출력해준다.

     

     
    SELECT salary, TO_CHAR(salary, '$9999999')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'$9999999')|
    
    ------+--------------------------+
    
     24000|   $24000                 |
    
     17000|   $17000                 |
    
     17000|   $17000                 |
    
      9000|    $9000                 |
    
      6000|    $6000                 |
    
      4800|    $4800                 |
    
      4800|    $4800                 |
    
      4200|    $4200                 |
    
     12008|   $12008                 |
    
      9000|    $9000                 |
    
      8200|    $8200                 |
    
      7700|    $7700                 |
    
      7800|    $7800                 |
    
    …

     

     

     


    형식문자 'L'

    부동 로컬통화기호를 변환할 숫자값의 왼쪽에 붙여서 출력하는 형식문자

    접속 도구 또는 데이터베이스의 국가설정에 맞는 통화기호가 출력된다.

     

     
    SELECT salary, TO_CHAR(salary, 'L9999999')
    FROM employees;
    SALARY|TO_CHAR(SALARY,'L9999999')|
    
    ------+--------------------------+
    
     24000|          ₩24000          |
    
     17000|          ₩17000          |
    
     17000|          ₩17000          |
    
      9000|           ₩9000          |
    
      6000|           ₩6000          |
    
      4800|           ₩4800          |
    
      4800|           ₩4800          |
    
      4200|           ₩4200          |
    
     12008|          ₩12008          |
    
      9000|           ₩9000          |
    
      8200|           ₩8200          |
    
      7700|           ₩7700          |
    
      7800|           ₩7800          |
    
      6900|           ₩6900          |
    
    …

     

     

     

     

     
    SQL> SELECT salary, TO_CHAR(salary, 'L9999999')
      2  FROM employees;

     

        SALARY TO_CHAR(SALARY,'L9
    
    ---------- ------------------
    
         24000             $24000
    
         17000             $17000
    
         17000             $17000
    
          9000              $9000
    
          6000              $6000
    
          4800              $4800
    
          4800              $4800
    
          4200              $4200
    
         12008             $12008
    
          9000              $9000
    
          8200              $8200
    
    …

     

     


    형식문자 '.'

    • 형식문자 '.'은 숫자값을 문자열로 변환 시 변환될 숫자의 정밀도를 결정할 수 있다.
    • 소수점을 사용하지 않는 경우 정수범위까지 반올림한 결과를 출력해준다.
     
    SELECT commission_pct, TO_CHAR(commission_pct, '9999')
    FROM employees
    WHERE commission_pct IS NOT NULL;
    COMMISSION_PCT|TO_CHAR(COMMISSION_PCT,'9999')|
    
    --------------+------------------------------+
    
               0.4|    0                         |
    
               0.3|    0                         |
    
               0.3|    0                         |
    
               0.3|    0                         |
    
               0.2|    0                         |
    
               0.3|    0                         |
    
              0.25|    0                         |
    
              0.25|    0                         |
    
               0.2|    0                         |
    
               0.2|    0                         |
    
              0.15|    0                         |
    
              0.35|    0                         |
    
              0.35|    0                         |
    
              0.35|    0                         |
    
    …

     

     

    형식문자 '999.99' 는 소수점기호 '.'의 오른쪽에 99가 있으므로 소수점 아래 두자리까지 표현하여 문자열로 변환되며 정수범위는 3자리까지 변환을 하게 된다. 

     
    SELECT commission_pct, TO_CHAR(commission_pct, '999.99')
    FROM employees
    WHERE commission_pct IS NOT NULL;
    COMMISSION_PCT|TO_CHAR(COMMISSION_PCT,'999.99')|
    
    --------------+--------------------------------+
    
               0.4|    .40                         |
    
               0.3|    .30                         |
    
               0.3|    .30                         |
    
               0.3|    .30                         |
    
               0.2|    .20                         |
    
               0.3|    .30                         |
    
              0.25|    .25                         |
    
              0.25|    .25                         |
    
               0.2|    .20                         |
    
    …

     

     

     

     

     

    다음 예제와 같이 소수점 아래 한자리의 정밀도로 변환하는 경우 소수점아래에서는 자리값이 모자라면 자동으로 반올림된 결과를 출력하게 된다.

     
    SELECT commission_pct, TO_CHAR(commission_pct, '999.9')
    FROM employees
    WHERE commission_pct IS NOT NULL;
    COMMISSION_PCT|TO_CHAR(COMMISSION_PCT,'999.9')|
    
    --------------+-------------------------------+
    
               0.4|    .4                         |
    
               0.3|    .3                         |
    
               0.3|    .3                         |
    
               0.3|    .3                         |
    
               0.2|    .2                         |
    
               0.3|    .3                         |
    
              0.25|    .3                         |
    
              0.25|    .3                         |
    
               0.2|    .2                         |
    
               0.2|    .2                         |

     

     

     

    다음 예문의 경우 소수점 아래의 정밀도는 형식문자 '.'으로 정했으나 변환될 정수부분의 형식문자 길이가 부족하여 깨진 문자열이 반환되었음.

    형식문자 '9999.99'는 정수범위 4자리까지 표현할 수 있는 형태이다.

     
    SELECT salary, TO_CHAR(salary, '9999.99')
    FROM employees
    WHERE commission_pct IS NOT NULL;
    SALARY|TO_CHAR(SALARY,'9999.99')|
    
    ------+-------------------------+
    
     14000|########                 |
    
     13500|########                 |
    
     12000|########                 |
    
     11000|########                 |
    
     10500|########                 |
    
     10000|########                 |
    
      9500| 9500.00                 |
    
      9000| 9000.00                 |
    
      8000| 8000.00                 |
    
      7500| 7500.00                 |
    
    …
     

     

     

     

    SELECT salary, TO_CHAR(salary, '99999.99')
    FROM employees
    WHERE commission_pct IS NOT NULL;
    SALARY|TO_CHAR(SALARY,'99999.99')|
    
    ------+--------------------------+
    
     14000| 14000.00                 |
    
     13500| 13500.00                 |
    
     12000| 12000.00                 |
    
     11000| 11000.00                 |
    
     10500| 10500.00                 |
    
     10000| 10000.00                 |
    
      9500|  9500.00                 |
    
      9000|  9000.00                 |
    
      8000|  8000.00                 |
    
      7500|  7500.00                 |
    
    …

     

     


    형식문자 ','

    형식문자 ','는 일반적으로 천단위를 구분하는 목적으로 사용되는 ',' 기호를 변환 결과에 추가하는 형식문자이다.

    형식문자의 ',' 기호는 무조건 출력되는 것이 아닌 변환할 대상 숫자의 길이에 맞춰 결과를 변환하여 출력한다.

     

     
    SELECT TO_CHAR(123456, '9,999,999')
    FROM dual;
    TO_CHAR(123456,'9,999,999')|
    
    ---------------------------+
    
       123,456                 |

     

     

     

    • ',' 기호는 입력해야하는 위치값이 정해져 있는 것은 아님.
     
    SELECT TO_CHAR(123456, '999,9,9,99')
    FROM dual;
    TO_CHAR(123456,'999,9,9,99')|
    
    ----------------------------+
    
      12,3,4,56                 |



     

     

     
    SELECT TO_CHAR(salary, '$99,999.00') salary
    FROM employees
    WHERE last_name = 'Ernst';
    SALARY     |
    
    -----------+
    
      $6,000.00|

     

     

    연습문제 풀이(p.21)

    • 3. 
     
    SELECT last_name || ' earns ' || TO_CHAR(salary, '$99,999.00') || ' monthly but wants ' ||
    TO_CHAR(salary*3, '$99,999.00') || '.' AS "Dream Salaries"
    FROM employees;
    Dream Salaries                                              |
    
    ------------------------------------------------------------+
    
    King earns  $24,000.00 monthly but wants  $72,000.00.       |
    
    Kochhar earns  $17,000.00 monthly but wants  $51,000.00.    |
    
    De Haan earns  $17,000.00 monthly but wants  $51,000.00.    |
    
    Hunold earns   $9,000.00 monthly but wants  $27,000.00.     |
    
    Ernst earns   $6,000.00 monthly but wants  $18,000.00.      |
    
    Austin earns   $4,800.00 monthly but wants  $14,400.00.     |
    
    Pataballa earns   $4,800.00 monthly but wants  $14,400.00.  |
    
    Lorentz earns   $4,200.00 monthly but wants  $12,600.00.    |
    
    Greenberg earns  $12,008.00 monthly but wants  $36,024.00.  |
    
    Faviet earns   $9,000.00 monthly but wants  $27,000.00.     |
    
    Chen earns   $8,200.00 monthly but wants  $24,600.00.       |
    
    Sciarra earns   $7,700.00 monthly but wants  $23,100.00.    |
    
    Urman earns   $7,800.00 monthly but wants  $23,400.00.      |
    
    …

     

    728x90
    반응형

    'DB' 카테고리의 다른 글

    0921 DB - 일반함수  (1) 2022.09.21
    0920 DB - 형식 문자(2)  (0) 2022.09.20
    0913 DB - 형 변환 함수  (2) 2022.09.13
    0913 JSP - 자원해제 메서드-closeDB(), 페이징 처리 (1)  (1) 2022.09.13
    0907 DB - 숫자, 날짜 함수  (0) 2022.09.07