목차
시간 형식문자
- 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년도 09월 14일 이다. |
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. |
…
'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 |