개발자의 길

[ORACLE] TO_CHAR 함수 모든것! 본문

3. DB

[ORACLE] TO_CHAR 함수 모든것!

자르르 2013. 12. 26. 15:09


TO_CHAR(datetime) 함수


이 함수는 DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE의 데이터타입을 사용자가 지정한 폼을 갖는 VARCHAR2의 데이터타입으로 변환한다.
? DATE은 디폴트 date 포맷으로 바뀐다.

? TIMESTAMP나 TIMESTAMP WITH LOCAL TIME ZONE은 디폴트 TIMESTAMP 포맷으로 바뀐다.
? TIMESTAMP WITH TIME ZONE은 디폴트 TIMESTAMP WITH TIME ZONE 포맷으로 바뀐다.

【형식】
 	TO_CHAR( date [,'fmt' [,'nlsparam']])

날짜 출력 형식의 종류(Datetime Format Elements)
종류의미사용 예결과
CC
SCC
세기(世紀) 표시(sysdate,'CC')
(sysdate,'SCC')
21
21
AD (A.D.)
BC (B.C.)
BC,AD 표현(sysdate,'AD')
(sysdate,'BC')
AD
BC
Q 월을 분기로 표시(sysdate,'Q')4(10-12월)
MI minute을 표시(sysdate,'MI')21
MM 월을 숫자로 표시(sysdate,'MM')11
MONTH 달의 영문표기 모두 표시(sysdate,'MONTH')NOVEMER
MON 3문자로 된 달의 이름(sysdate,'MON')NOV
WW 년중 몇번째 주(sysdate,'WW')44
W 월중 몇번째 주(sysdate,'W')4
DDD 연중 일로 표현(sysdate,'DDD')329
DD 월중 일로 표현(sysdate,'DD')25
D 주중 일로 표현(sysdate,'D')6
DY 3문자로 된 요일표기(sysdate,'DY')FRI
DAY 요일의 영문표기 모두 표시(sysdate,'DAY')FRIDAY
DL long date format(자세한 날짜형식)으로 표기
'fmDay, Month dd, YYYY'
'fmDay, dd. Month YYYY'
(sysdate,'DL')Thursday, February 12, 2009
DS short date format(간략한 날짜형식)으로 표기
'MM/DD/RRRR'
'DD/MM/RRRR'
(sysdate,'DS')2/12/2009
FF[1...9] 밀리초의 표시자리수 지정
'HH:MI:SS.FF'
'SS.FF5'
(systimestamp,'SS.FF')51.978
HH
HH12
HH24
시간 표기(12시간, 24시간표기)(systimestamp,'HH')
(sysdate,'HH24')
06
18
IW 1년중 몇째주(systimestamp,'IW')07
I
IY
IYY
IYYY
년표기의 자릿수(sysdate,'I')
(sysdate,'IY')
(sysdate,'IYY')
(sysdate,'IYYY')
9
09
009
2009
J Julian년호 숫자(sysdate,'J')2454875
AM (A.M.)
PM (P.M.)
오전, 오후의 영문 표기(sysdate,'AM')
(sysdate,'PM')
AM
PM
RM 달을 로마자 표기(sysdate,'RM')II
RR 2자릿수 년도 표기, YY와 달리 명시한 년도수에 따라 값이 틀림
RRRR 년을 2자리, 또는 4자리로 표기(sysdate,'RRRR')2009
SS 현재시간의 초(0∼59)(sysdate,'SS')20
SSSSS 자정부터 지금까지 지난 초(0∼86399)(sysdate,'SSSSS')37230
TS 시간의 간략표기(sysdate,'TS')10:28:51 AM
TZD TZR에 의한 daylight표기(systimestamp,'TZD') 
TZH Time Zone HOUR표기(systimestamp,'TZH')+09
TZM Time Zone Minute 표기(systimestamp,'TZM')02
TZR Time Zone 표기(systimestamp,'TZR')+09:00
X Local radix character 표기(systimestamp,'HH:MI:SSXFF')
Isystimestamp,'X')
11:00:57.025518
.
YEAR
SYEAR
년도 영문으로 표시
BC는 (-)로 표기
(sysdate,'YEAR')
(sysdate,'SYEAR')
TWO THOUSAND NINE
TWO THOUSAND NINE
YYY
YY
Y
년도 표현 (sysdate,'YYY')
(sysdate,'YY')
(sysdate,'Y')
009
09
9
YYYY
SYYYY
4자리 년도 표시
BC는 (-)로 표기
(sysdate,'YYYY')
(sysdate,'SYYYY')
2009
2009
Y,YYY 4자리 년도 표시중 컴마사용(sysdate,'Y,YYY')2,009
날짜의 출력 형식을 지정하는 접미사(Datetime format Element Suffixes)

앞의 표에서 나타낸 datetime format model을 더 다양하게 표시하기 위해서 사용하는 접미사의 종류와 용도를 정리하면 아래의 표와 같다.

접미사의미예시표시값
SP 날짜를 기수의 영문으로 표기(sysdate,'DDSP')FIVE
TH 날짜를 숫자로 된 서수의 영문으로 표기(sysdate,'DDTH')5TH
SPTH 날짜를 서수의 영문으로 표기(sysdate,'DDSPTH')FIFTH
THSP (sysdate,'DDTHSP')
"text" 인용부호속의 문자열을 결과에 그대로 표시(sysdate,'DD "of" MON')5 of FEB
-
/
.
,
;
:
인용부호 없이 사용한 문자를 결과에 그대로 표시 (sysdate,'DD-MON')
(sysdate,'DD/MON')
(sysdate,'DD,MON')
(sysdate,'DD.MON')
(sysdate,'DD;MON')
(sysdate,'DD:MON')
05-FEB
05/FEB
05,FEB
05.FEB
05;FEB
05:FEB
아래의 예제에서 DD, W, WW, MM은 날짜 포맷터이고 TH, SP, THSP, SPTH는 날짜 포맷터를 구체적으로 어떻게 표현할 지를 지시하는 접미사이다.
SQL> select to_char(sysdate,'DDTH') from dual;

TO_C
----
05TH

SQL> select to_char(sysdate,'DDSP') from dual;

TO_CHAR(SYSD
------------
FIVE

SQL> select to_char(sysdate,'DDSPTH') from dual;

TO_CHAR(SYSDAT
--------------
FIFTH

SQL> select to_char(sysdate,'DDTHSP') from dual;

TO_CHAR(SYSDAT
--------------
FIFTH

SQL> select to_char(sysdate,'WTH') from dual;

TO_
---
1ST

SQL> select to_char(sysdate,'MMTH') from dual;

TO_C
----
02ND

SQL> select to_char(sysdate,'WWTH') from dual;

TO_C
----
05TH

SQL>

【예제】
SQL> select sysdate, to_char(sysdate,'DD-MON-YYYY') from dual;

SYSDATE   TO_CHAR(SYS
--------- -----------
05-AUG-04 05-AUG-2004

SQL> select to_char(sysdate,'DY') from dual;

TO_
---
THU

SQL> select to_char(sysdate,'dd-mon-yy hh24:MI'), round(sysdate) 
  2  from dual;
 
TO_CHAR(SYSDATE,'D ROUND(SYSDAT
------------------ ------------
25-dec-05 18:52    26-DEC-05
 
SQL> select to_char(sysdate,'DD "of" MON') from dual;

TO_CHAR(SYSD
------------
05 of FEB

SQL> select to_char(sysdate,'DD-MON') from dual;

TO_CHAR(S
---------
05-FEB

SQL> select to_char(sysdate,'DD / MON') from dual;

TO_CHAR(SYS
-----------
05 / FEB

SQL> select to_char(sysdate,'DD,MON') from dual;

TO_CHAR(S
---------
05,FEB

SQL> select to_char(sysdate,'DD.MON') from dual;

TO_CHAR(S
---------
05.FEB

SQL> select to_char(sysdate,'DD;MON') from dual;

TO_CHAR(S
---------
05;FEB

SQL> select to_char(sysdate,'DD:MON') from dual;

TO_CHAR(S
---------
05:FEB

SQL> select to_char(sysdate,'CC'), to_char(sysdate,'SCC') from dual;

TO_C TO_CHA
---- ------
21    21

SQL> select to_char(systimestamp,'Y,YYY') from dual;

TO_CHAR(SY
----------
2,009

SQL> select to_char(sysdate,'YEAR'),to_char(sysdate,'AD'),
  2         to_char(sysdate,'Q'),   to_char(sysdate,'MM'),
  3         to_char(sysdate,'MON'), to_char(sysdate,'MONTH') 
  4  from dual;
 
TO_CHAR(SYSDATE,'YEAR')                    TO_CHA T TO TO_CHAR( TO_CHA
------------------------------------------ ------ - -- -------- ------
TWO THOUSAND SIX                           서기   1 02 2월      2월
 
SQL> select to_char(sysdate,'RM'), to_char(sysdate,'WW'),
  2         to_char(sysdate,'W'),  to_char(sysdate,'DDD'),
  3         to_char(sysdate,'DD'), to_char(sysdate,'D'),
  4         to_char(sysdate,'DY'), to_char(sysdate,'DAY') from dual;
 
TO_C TO T TO_ TO T TO_C TO_CHAR(S
---- -- - --- -- - ---- ---------
II   06 2 039 08 4 수   수요일
 
SQL> select to_char(sysdate,'DL') from dual;

TO_CHAR(SYSDATE,'DL')
--------------------------------------------------------------------------
Thursday, February 12, 2009

SQL> select to_char(sysdate,'fmDay, Month dd, YYYY') from dual;

TO_CHAR(SYSDATE,'FMDAY,MONTHDD,YYYY')
--------------------------------------------------------------------------
Thursday, February 12, 2009

SQL> select to_char(sysdate,'fmDay, dd. Month YYYY') from dual;

TO_CHAR(SYSDATE,'FMDAY,DD.MONTHYYYY')
--------------------------------------------------------------------------
Thursday, 12. February 2009

SQL> select to_char(sysdate,'MM/DD/RRRR') from dual;

TO_CHAR(SYSDATE,'MM/
--------------------
02/12/2009

SQL> select to_char(sysdate,'DD/MM/RRRR') from dual;

TO_CHAR(SYSDATE,'DD/
--------------------
12/02/2009

SQL> select to_char(sysdate,'DS') from dual;

TO_CHAR(SYSDATE,'DS'
--------------------
2/12/2009

SQL> select to_char(systimestamp,'HH:MI:SS.FF') from dual;

TO_CHAR(SYSTIMESTAMP,'HH:MI:SS.FF')
------------------------------------
06:15:23.933285

SQL> select to_char(systimestamp,'SS.FF3') from dual;

TO_CHAR(SYSTIMESTAMP,'SS
------------------------
51.978

SQL> select to_char(sysdate,'HH'), to_char(sysdate,'HH12'), 
  2         to_char(sysdate,'HH24') from dual;

TO_C TO_C TO_C
---- ---- ----
06   06   18

SQL> select to_char(sysdate,'IW') from dual;

TO_C
----
07

SQL> select to_char(sysdate,'I') "i",     to_char(sysdate,'IY') "iy",
  2         to_char(sysdate,'IYY') "iyy", to_char(sysdate,'IYYY') "iyyy"
  3  from dual;

i  iy   iyy    iyyy
-- ---- ------ --------
9  09   009    2009

SQL> select to_char(sysdate,'J') from dual;

TO_CHAR(SYSDAT
--------------
2454875

SQL> select to_char(sysdate,'AM'), to_char(sysdate,'PM') from dual;

TO_C TO_C
---- ----
PM   PM

SQL> select sysdate, to_char(sysdate,'Q') from dual;

SYSDATE      TO
------------ --
13-FEB-09    1

SQL> select sysdate, to_char(sysdate,'RM') from dual;

SYSDATE      TO_CHAR(
------------ --------
13-FEB-09    II

SQL> select to_char(sysdate,'RR'), to_char(sysdate,'RRRR') from dual;

TO_C TO_CHAR(
---- --------
09   2009

SQL> select to_char(systimestamp,'HH:MI:SS.FF'),
  2         to_char(sysdate,'SS'), to_char(sysdate,'SSSSS') from dual;

TO_CHAR(SYSTIMESTAMP,'HH:MI:SS.FF')  TO_C TO_CHAR(SY
------------------------------------ ---- ----------
10:20:30.731386                      30   37230

SQL> select to_char(sysdate,'TS') from dual;

TO_CHAR(SYSDATE,'TS')
----------------------
10:28:51 AM

SQL> select to_char(systimestamp,'TZD'), to_char(systimestamp,'TZH'),
  2         to_char(systimestamp,'TZM'), to_char(systimestamp,'TZR')
  3   from dual;

TO_CHAR(SYST TO_CHA TO_C TO_CHAR(SYSTIMESTAMP,'TZR')
------------ ------ ---- -----------------------------
             +09    00   +09:00

SQL> select to_char(sysdate,'W'), to_char(sysdate,'WW') from dual;

TO TO_C
-- ----
2  07

SQL> select to_char(systimestamp,'HH:MI:SSXFF'),
  2         to_char(systimestamp) from dual;

TO_CHAR(SYSTIMESTAMP,'HH:MI:SSXFF')    TO_CHAR(SYSTIMESTAMP)
-------------------------------------- ------------------------------------------
11:00:57.025518                        13-FEB-09 11.00.57.025518 AM +09:00


SQL> select to_char(systimestamp,'X') from dual;

TO
--
.

SQL> select to_char(sysdate,'YEAR') "year",
  2         to_char(sysdate,'SYYYY') "syyyy" from dual;

year                      syyyy
------------------------- ----------------
TWO THOUSAND NINE         2009

SQL> select to_char(sysdate,'YYYY'), to_char(sysdate,'YYY'),
  2         to_char(sysdate,'YY'),   to_char(sysdate,'Y') from dual;
 
TO_C TO_ TO T
---- --- -- -
2009 009 09 9

SQL> select to_char(sysdate,'YYYY'),
  2         to_char(sysdate,'SYYYY') from dual;

TO_CHAR( TO_CHAR(SY
-------- ----------
2009      2009

SQL> select to_char(sysdate,'Y,YYY') from dual;

TO_CHAR(SY
----------
2,009

SQL> select to_char(sysdate,'HH'),    to_char(sysdate,'HH24'),
  2         to_char(sysdate,'MI'),    to_char(sysdate,'SS'),
  3         to_char(sysdate,'SSSSS'), to_char(sysdate,'AM')
  4  from dual;
 
TO TO TO TO TO_CH TO_C
-- -- -- -- ----- ----
07 19 59 58 71998 오후
 
SQL>
날짜의 출력 형식을 지정하는 접두사(Datetime Format Model Modifier: FX와 FM)
FM과 FX Modifier는 TO_CHAR 함수내에서 포맷 모델로 쓰여, 날짜 앞 뒤의 빈공백(blank padding)이나 포맷이 날짜의 포맷과 정확히 일치하는 체크(exact format checking)할 때 사용된다.
그러므로 fx를 사용하면 update 문에서 to_date를 이용하여 데이터를 갱신할 때 기존의 데이터 포맷과 동일성 여부를 체크하여 일치하는 경우에만 데이터를 갱신할 수 있으므로 데이터의 일관성에 유용하다.

구분설명
FM 날짜 표기에서 공백을 표시하지 않음
FX 날짜의 표기가 정확한지 체크
FXFM FX와 FM을 중복하여 적용
 
SQL> select to_char(sysdate, 'fmDDTH')??' of '??
  2         to_char(sysdate,'fmMonth')??', '??
  3         to_char(sysdate,'YYYY') "Ides" from dual

Ides
---------------------------
8TH of April, 2010
☜ fm 변경자(modifier)를 이용한 경우로 월(月)의 표현에 빈 자리가 생략되어 표현됨
공백의 blank padding이 없음
SQL> select to_char(sysdate, 'DDTH')??' of '??
  2         to_char(sysdate, 'Month')??', '??
  3         to_char(sysdate, 'YYYY') "Ides"  from dual;

Ides
---------------------------
08TH of April    , 2010
☜ fm 변경자(modifier)를 사용하지 않은 경우로 월(月)이 9자리로 월 표현 후에 나머지 공간은 블랭크로 표현됨,
공백의 blank padding이 있음
☜ 다음 예처럼 단중 인용부호를 표현해야 할 경우에는 단중인용부호를 연이어 두개 사용하면 된다. SQL> select to_char(sysdate, 'fmDay')??'''s Special' "Menu" from dual; Menu ----------------------- Monday's Special SQL> 다음은 UPDATE table SET date_column = TO_DATE(char, 'fmt')를 실행했를 경우의 오류 관계를 나타내었다.
char'fmt'Match or Error?
'15/ JAN /2010' 'DD-MON-YYYY' Match
'15! JAN% /2010' 'DD-MON-YYYY' Error
'15/JAN/2010' 'FXDD-MON-YYYY' Error
'15-JAN-2010' 'FXDD-MON-YYYY' Match
'1-JAN-2010' 'FXDD-MON-YYYY' Error
'01-JAN-2010' 'FXDD-MON-YYYY' Match
'1-JAN-2010' 'FXFMDD-MON-YYYY' Match
SQL> select * from aa; NAME LOGGING -------------------- ---------------------------------------- 좋아요 06-JAN-10 11.00.14.000000 AM SQL> UPDATE aa SET logging=TO_DATE('15/ JAN /2010','DD-MON-YYYY'); 1 row updated. SQL> select * from aa; NAME LOGGING -------------------- ---------------------------------------- 좋아요 15-JAN-10 12.00.00.000000 AM SQL> UPDATE aa SET logging=TO_DATE('20-FEB-2010','FXDD-MON-YYYY'); 1 row updated. SQL> select * from aa; NAME LOGGING -------------------- ---------------------------------------- 좋아요 20-FEB-10 12.00.00.000000 AM SQL> UPDATE aa SET logging=TO_DATE('01-MAR-2010','FXDD-MON-YYYY'); 1 row updated. SQL> select * from aa; NAME LOGGING -------------------- ---------------------------------------- 좋아요 01-MAR-10 12.00.00.000000 AM SQL> UPDATE aa SET logging=TO_DATE('1-APR-2010','FXFMDD-MON-YYYY'); 1 row updated. SQL> select * from aa; NAME LOGGING -------------------- ---------------------------------------- 좋아요 01-APR-10 12.00.00.000000 AM SQL> select to_char(sysdate,'FXFMDD-MON-YYYY') from dual; TO_CHAR(SYSDAT -------------- 8-FEB-2010 SQL>
현재 시스템에 설정되어 있는 날짜 포맷을 확인하는 방법은 다음과 같다. SQL> select value from nls_session_parameters 2 where parameter='NLS_DATE_FORMAT'; VALUE ---------------------- DD-MON-RR SQL>
일시적으로 날짜 포맷을 변경할 수 있으며, 이 방법은 sqlplus를 종료하면 해제되기 때문에 재접속시 다시 설정해야 한다.

SQL> select hiredate from emp;

HIREDATE
------------
17-DEC-80
20-FEB-81
22-FEB-81
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82

14 rows selected.

SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD';

Session altered.

SQL> select hiredate from emp;

HIREDATE
----------
1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-09-28
1981-05-01
1981-06-09
1987-04-19
1981-11-17
1981-09-08
1987-05-23
1981-12-03
1981-12-03
1982-01-23

14 rows selected.  

【예제】
SQL> create table date_tab(
  2    ts_col    TIMESTAMP,
  3    tsltz_col TIMESTAMP WITH LOCAL TIME ZONE,
  4    tstz_col  TIMESTAMP WITH TIME ZONE);

Table created.

SQL> alter session set time_zone = '+9:00';

Session altered.

SQL> insert into date_tab values(
  2    TIMESTAMP '2009-12-01 10:00:00',
  3    TIMESTAMP '2009-12-01 10:00:00',
  4    TIMESTAMP '2009-12-01 10:00:00');

1 row created.

SQL> insert into date_tab values(
  2    TIMESTAMP '2009-12-02 10:00:00 +9:00',
  3    TIMESTAMP '2009-12-02 10:00:00 +9:00',
  4    TIMESTAMP '2009-12-02 10:00:00 +9:00');

1 row created.

SQL> select TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_date,
  2   TO_CHAR(tstz_col, 'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS tstz_date
  3  from date_tab
  4  order by ts_date, tstz_date;

TS_DATE                         TSTZ_DATE
------------------------------- ------------------------------------------
01-DEC-2009 10:00:00.000000     01-DEC-2009 10:00:00.000000 +09:00
02-DEC-2009 10:00:00.000000     02-DEC-2009 10:00:00.000000 +09:00

SQL> select SESSIONTIMEZONE,
  2   TO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz
  3  from date_tab
  4  order by sessiontimezone, tsltz;

SESSIONTIMEZONE  TSLTZ
---------------- --------------------------------------------------
+09:00           01-DEC-2009 10:00:00.000000
+09:00           02-DEC-2009 10:00:00.000000

SQL> alter SESSION SET TIME_ZONE = '-5:00';

Session altered.

SQL> select SESSIONTIMEZONE,
  2   TO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz
  3  from date_tab
  4  order by sessiontimezone, tsltz;

SESSIONTIMEZONE   TSLTZ
----------------- -------------------------------------------
-05:00            01-DEC-2009 20:00:00.000000
-05:00            30-NOV-2009 20:00:00.000000

SQL> select SESSIONTIMEZONE,
  2   to_char(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz_col
  3  from date_tab
  4  order by sessiontimezone, tsltz_col;

SESSIONTIMEZONE   TSLTZ_COL
----------------- -------------------------------------------------
-05:00            01-DEC-2009 20:00:00.000000
-05:00            30-NOV-2009 20:00:00.000000

SQL>
날짜의 연산

날짜 데이터는 날짜나 숫자를 더하거나 빼는 등의 산술 연산이 가능하며, 가능한 날짜의 연산은 다음과 같다.

연산결과비고
날짜 + 숫자 날짜 주어진 숫자(일 수)를 날짜에 더한다.
날짜 - 숫자 날짜 날짜에서 주어진 숫자(일 수)를 뺀다.
날짜 - 날짜 숫 자(일 수) 하나의 날짜에서 다른 하나의 날짜를 뺀다.
날짜 + 숫자/24 날짜 날짜에 시간을 더한다.
NLS 환경값 확인
nls_database_parameters오라클 설치시에 영구적으로 결정된 값으로 변경불가
nls_instance_parameters명시적으로 설정된 parameter 값을 보여줌
초기화 parameter에 미리 결정되어 있는 값을 보여 줌
nls_session_parameters현재 session에서 실제로 적용되고 있는 nls parameter의 설정값을 확인
이는 v$nls_parameters와 동일한 값을 출력




이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments