날짜형 데이터 타입
날짜형 데이터 타입#
날짜형 타입은 날짜와 시간 데이터를 저장하는데 사용된다.
DATE#
흐름도#
구문#
DATE
설명#
8바이트 크기의 날짜 값을 저장하는 데이터 타입이다.
저장할 수 있는 날짜의 범위는 시스템에 따라 다르다. 일반적으로 1년 1월 1일부터 9999년 12월 31일의 범위 내에서 사용 가능하다.
날짜 값은 날짜형 데이터 형식을 사용해서 다양한 포맷으로 출력할 수 있다.
날짜형 데이터 형식#
날짜형 데이터 타입의 데이터는 데이터베이스 내부적으로는 숫자형 데이터로 관리하지만 사용자는 TO_CHAR또는 TO_DATE 변환 함수 등을 사용해서 문자열로 표시할 수 있다. 변환 함수를 사용할 때 사용자는 보고자 하는 형식에 맞게 날짜형 데이터 형식 문자열을 지정해 주어야 한다.
날짜형 데이터 형식은 다음과 같은 기본요소들로 구성된다.
- AM, PM
- SCC, CC
- D, DD, DDD, DAY, DY
- HH, HH12, HH24
- MM, MON, MONTH
- MI
- Q
- SS, SSSSS, SSSSSS, SSSSSSSS, FF[1..6]
- WW, WW2, W, IW
- Y, YYY
- SYYYY, YYYY, YYY, YY, Y, RR, RRRR
- IYYY, IYY, IY, I
위의 기본 요소들과 함께 다음의 다음의 구두점과 특수 문자들도 날짜형 데이터 형식을 구성하는 요소이다.
- 하이픈(-)
- 슬래시(/)
- 쉼표(,)
- 마침표(.)
- 콜론(:)
- 홑따옴표(')
각각의 기본 요소들이 의미하는 바와 활용 예를 다음에서 살펴보자.
AM, PM#
설명#
정오를 기준으로 오전/오후를 구분한다. ('AM' 또는 'PM')
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '13', 'HH' ), 'AM' ) FROM dual;
TO_CHAR ( TO_DATE( '13', 'HH' ), 'AM' )
-------------------------------------------
PM
1 row selected.
iSQL> SELECT TO_DATE('1980-12-28 PM', 'YYYY-MM-DD AM') FROM dual;
TO_DATE('1980-12-28 PM', 'YYYY-MM-DD AM'
-------------------------------------------
1980/12/28 12:00:00
1 row selected.
SCC#
설명#
세기를 표시한다.
- 4자리 년도 중 뒤의 2자리 값이 01~99이면, 4자리 년도 중 앞의 두 자리의 값에 1을 더해서 반환한다.
- 4자리 년도 중 뒤의 2자리 값이 00이면, 4자리 년도 중 앞의 두 자리 값을 그대로 반환한다.
기원전은 년도 앞에 '-'가 표시된다.
- 년도가 0000인 경우 기원전 1년이며, -0001인 경우 기원전 2년이다.
- 0000~ -0099는 -1세기이며, -01로 표시된다.
TO_DATE 함수에서는 인자로 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'SCC' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'SCC' )
------------------------------------
20
1 row selected.
iSQL> SELECT TO_CHAR ( DATE'01-JAN-0001' - 1, 'SCC' ) FROM dual;
TO_CHAR ( DATE'01-JAN-0001' - 1, 'SCC' )
--------------------------------------------
-01
1 row selected.
CC#
설명#
세기를 표시한다.
- 4자리 년도 중 뒤의 2자리 값이 01~99이면, 4자리 년도 중 앞의 두 자리의 값에 1을 더해서 반환한다.
- 4자리 년도 중 뒤의 2자리 값이 00이면, 4자리 년도 중 앞의 두 자리 값을 그대로 반환한다.
TO_DATE 함수에서는 인자로 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'CC' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'CC' )
-----------------------------------
20
1 row selected.
D#
설명#
일주일 중 몇 번째 날인지를 나타내는 1 ~ 7까지의 숫자이다. 일요일부터 1로 시작한다.
TO_DATE 함수에서 인자로 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'D' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'D' )
----------------------------------
1
1 row selected.
DAY#
설명#
요일의 영문이름을 나타낸다. (SUNDAY, MONDAY,…)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'DAY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'DAY' )
------------------------------------
SUNDAY
1 row selected.
DD#
설명#
한달 중 몇 번째 날인지를 나타낸다. (1 ~ 31)
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'DD' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'DD' )
-----------------------------------
28
1 row selected.
iSQL> SELECT TO_DATE( '1980-12-28', 'YYYY-MM-DD') FROM dual;
TO_DATE( '1980-12-28', 'YYYY-MM-DD')
---------------------------------------
1980/12/28 00:00:00
1 row selected.
DDD#
설명#
일 년 중 몇 번째 날인지를 나타낸다. (1 ~ 366)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'DDD' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'DDD' )
------------------------------------
363
1 row selected.
DY#
설명#
요일의 이름을 약자로 나타낸다. (SUN, MON, TUE, …)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'DY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'DY' )
-----------------------------------
SUN
1 row selected.
FF [1..6]#
설명#
FF다음의 1 ~ 6까지의 숫자를 이용하여 마이크로초의 자리 수를 나타낸다. (0 ~ 999999). FF 형식은 FF6과 같은 같은 결과를 반환한다.
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( SYSDATE, 'FF5' ) FROM dual;
TO_CHAR ( SYSDATE, 'FF5' )
------------------------------
34528
1 row selected.
HH, HH24#
설명#
시간을 24시간 단위로 나타낸다.(0 ~ 23)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '2008-12-28 17:30:29', 'YYYY-MM-DD HH:MI:SS' ), 'HH' ) FROM dual;
TO_CHAR ( TO_DATE( '2008-12-28 17:30:29'
--------------------------------------------
17
1 row selected.
iSQL> SELECT TO_CHAR ( TO_DATE( '2008-12-28 17:30:29', 'YYYY-MM-DD HH24:MI:SS' ), 'YYYY-MM-DD HH24:MI:SS' ) FROM dual;
TO_CHAR ( TO_DATE( '2008-12-28 17:30:29',
------------------------------------------
2008-12-28 17:30:29
1 row selected.
HH12#
설명#
시간을 12시간 단위로 나타낸다.(1 ~ 12)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '2008-12-28 17:30:29', 'YYYY-MM-DD HH:MI:SS' ), 'HH12' ) FROM dual;
TO_CHAR ( TO_DATE( '2008-12-28 17:30:29',
---------------------------------------------
05
1 row selected.
iSQL> SELECT TO_CHAR( TO_DATE ( '08-12-28 05:30:29', 'RR-MM-DD HH12:MI:SS' ), 'RR-MM-DD HH12:MI:SS') FROM dual;
TO_CHAR( TO_DATE ( '08-12-28 05:30:29', 'R
--------------------------------------------
08-12-28 05:30:29
1 row selected.
MI#
설명#
분 (0 ~ 59)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '1980-12-28 17:30:29', 'YYYY-MM-DD HH:MI:SS' ), 'HH' ) FROM dual;
TO_CHAR ( TO_DATE( '1980-12-28 17:30:29'
--------------------------------------------
17
1 row selected.
iSQL> SELECT TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD HH:MI:SS' ) FROM dual;
TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD
-------------------------------------------
2005/12/28 14:30:29
1 row selected.
MM#
설명#
월 (01 ~ 12)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '1980-12-28 17:30:29', 'YYYY-MM-DD HH:MI:SS' ), 'HH' ) FROM dual;
TO_CHAR ( TO_DATE( '1980-12-28 17:30:29'
--------------------------------------------
17
1 row selected.
iSQL> SELECT TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD HH:MI:SS' ) FROM dual;
TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD
-------------------------------------------
2005/12/28 14:30:29
1 row selected.
MON#
설명#
월의 이름을 약자로 표시한다.( JAN, FEB, MAR, … )
예제#
SQL> SELECT TO_CHAR (TO_DATE ('1995-12-05', 'YYYY-MM-DD'), 'MON') FROM dual;
TO_
---
DEC
MONTH#
설명#
월의 이름을 표시한다. (JANUARY, FEBRUARY, … )
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'Month' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'Month' )
--------------------------------------
December
1 row selected.
iSQL> SELECT TO_DATE ( '05-APRIL-28 14:30:29', 'RR-MONTH-DD HH:MI:SS' ) FROM dual;
TO_DATE ( '05-APRIL-28 14:30:29', 'RR-MO
-------------------------------------------
2005/04/28 14:30:29
1 row selected.
Q#
설명#
분기를 표시한다. (1 ~ 4)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'Q' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'Q' )
----------------------------------
4
1 row selected.
RM#
설명#
로마 숫자로 월을 나타낸다. (I, II, III, IV,... )
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'RM' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'RM' )
-----------------------------------
XII
1 row selected.
iSQL> SELECT TO_DATE ('28-V-1980', 'DD-RM-YYYY') FROM dual;
TO_DATE ('28-V-1980', 'DD-RM-YYYY')
--------------------------------------
1980/05/28 00:00:00
1 row selected.
RR#
설명#
년도를 두자리 정수로 표시한다. 날짜를 표기할 때, 두 자리만 표기한 경우 50미만인 경우에만 21세기라고 가정하여 2000을 더하고, 50 경우에는 1900을 더해서 연도를 표시한다. 따라서 표시 가능한 년도는 1950 ~ 2049까지 이다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-80', 'RR' ) FROM dual;
TO_CHAR ( '28-DEC-80', 'RR' )
---------------------------------
80
1 row selected.
iSQL> SELECT TO_DATE ( '28-DEC-80', 'DD-MON-RR' ) FROM dual;
TO_DATE ( '28-DEC-80', 'DD-MON-RR' )
---------------------------------------
1980/12/28 00:00:00
1 row selected.
RRRR#
설명#
연도 (0 ~ 9999)
네자리, 두자리의 년도를 모두 입력으로 받아서, 숫자가 50미만인 경우 2000을 더하고, 50이상 100 미만인 경우 1900을 더해서 연도를 나타낸다. 4자리의 숫자인 경우 그대로가 년도로 표시된다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'RRRR' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'RRRR' )
-------------------------------------
1980
1 row selected.
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'DD-MON-RRRR' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'DD-MON-RRRR' )
--------------------------------------------
28-DEC-1980
1 row selected.
SS#
설명#
초 (0 ~ 59)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '1980-12-28 17:30:29', 'YYYY-MM-DD HH:MI:SS' ), 'HH' ) FROM dual;
TO_CHAR ( TO_DATE( '1980-12-28 17:30:29'
--------------------------------------------
17
1 row selected.
iSQL> SELECT TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD HH:MI:SS' ) FROM dual;
TO_DATE ( '05-12-28 14:30:29', 'RR-MM-DD
-------------------------------------------
2005/12/28 14:30:29
1 row selected.
SSSSS#
설명#
자정부터 현재까지 몇 초가 경과 되었는지 나타낸다. (0 ~ 86399)
예제#
iSQL> SELECT TO_CHAR ( TO_DATE( '1980-12-28 17:30:29', 'YYYY-MM-DD HH24:MI:SS' ), 'SSSSS' ) FROM dual;
TO_CHAR ( TO_DATE( '1980-12-28 17:30:29'
--------------------------------------------
63029
1 row selected.
iSQL> SELECT TO_DATE('1980-12-28 12345', 'YYYY-MM-DD SSSSS') FROM dual;
TO_DATE('1980-12-28 12345', 'YYYY-MM-DD
-------------------------------------------
1980/12/28 03:25:45
1 row selected.
SSSSSS#
설명#
날짜 데이터 타입의 값의 마이크로초를 표시한다.(0 ~ 999999)
예제#
iSQL> SELECT TO_CHAR (SYSDATE, 'SSSSSS') FROM dual;
TO_CHAR (SYSDATE, 'SSSSSS')
-------------------------------
490927
1 row selected.
iSQL> SELECT TO_CHAR ( TO_DATE('1980-12-28 123456', 'YYYY-MM-DD SSSSSS'), 'SSSSSS' ) FROM dual;
TO_CHAR ( TO_DATE('1980-12-28 123456', '
--------------------------------------------
123456
1 row selected.
SSSSSSSS#
설명#
초 + 마이크로초를 나타낸다. 앞의 2개의 숫자는 초를 나타내고, 나머지 6개의 숫자가 마이크로초를 나타낸다. (0 ~ 59999999)
예제#
iSQL> SELECT TO_CHAR (SYSDATE, 'SSSSSSSS') FROM dual;
TO_CHAR (SYSDATE, 'SSSSSSSS')
---------------------------------
48987403
1 row selected.
iSQL> SELECT TO_DATE ( '12.345678', 'SS.SSSSSS') FROM dual;
TO_DATE ( '12.345678', 'SS.SSSSSS')
--------------------------------------
2005/12/01 00:00:12
1 row selected.
iSQL> SELECT TO_CHAR( TO_DATE( '12.345678', 'SS.SSSSSS'), 'SSSSSS') FROM dual;
TO_CHAR( TO_DATE( '12.345678', 'SS.SSSSS
--------------------------------------------
345678
1 row selected.
WW#
설명#
일 년 중 몇 번째 주인지를 나타낸다. 1월 1일부터 그 주의 토요일까지가 그 해의 첫 번째 주이다. (1 ~ 54)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'WW' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'WW' )
-----------------------------------
53
1 row selected.
WW2#
설명#
요일과 상관없이 일 년 중 몇 번째 주인지를 나타낸다. 첫 번째 주는 1월 1일부터 시작하며, 7일 단위로 구분한다. (1~53주)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'WW2' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'WW2' )
-----------------------------------
52
1 row selected.
W#
설명#
한 달 중 몇 번째 주인지를 나타낸다. 1일부터 그 주의 토요일까지가 그 달의 첫 번째 주이다. (1 ~ 6)
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'W' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'W' )
----------------------------------
5
1 row selected.
IW#
설명#
ISO 8601에 따라 일 년 중 몇 번째 주인지를 나타낸다(1~52 또는 1~53). 주의 시작은 월요일이며, 첫 번째 주는 해당 연도의 첫 번째 목요일(1월 4일)을 포함한다.
TO_DATE 함수에서 사용할 수 없다.
- 2012.12.31(월) ~ 2013.01.06(일) : 2013년 01주
- 2014.12.29(월) ~ 2015.01.04(일) : 2015년 01주
- 2015.12.28(월) ~ 2016.01.03(일) : 2015년 53주
- 2016.12.26(월) ~ 2017.01.01(일) : 2016년 52주
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'IW' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'IW' )
-----------------------------------
52
1 row selected.
Y,YYY#
설명#
연도를 나타내는 숫자 중 임의의 위치에 ,(comma)를 삽입할 수 있다. 맨 앞이나 뒤에 와도 상관 없다.
TO_DATE 함수에서 사용할 수 없다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'Y,YYY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'Y,YYY' )
--------------------------------------
1,980
1 row selected.
SYYYY#
설명#
네 자리 숫자를 그대로 연도로 간주한다. 기원전은 '-'가 표시된다 (-9999 ~ 9999).
년도가 0000인 경우 기원전 1년, -0001은 기원전 2년을 나타낸다.
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'SYYYY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'SYYYY' )
--------------------------------------
1980
1 row selected.
iSQL> SELECT TO_CHAR ( DATE'01-JAN-0000' - 1, 'SYYYY-MM-DD' ) FROM dual;
TO_CHAR ( DATE'01-JAN-0000' - 1, 'SYYYY-MM
----------------------------------------------
-0001-12-31
1 row selected.
YYYY#
설명#
네 자리 숫자를 그대로 연도로 간주한다. (0 ~ 9999)
예제#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'YYYY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'YYYY' )
-------------------------------------
1980
1 row selected.
iSQL> SELECT TO_DATE ( '28-DEC-1980', 'DD-MON-YYYY' ) FROM dual;
TO_DATE ( '28-DEC-1980', 'DD-MON-YYYY' )
-------------------------------------------
1980/12/28 00:00:00
1 row selected.
YY#
설명#
연도의 마지막 숫자 2자리를 반환한다. 21세기라고 가정하고 2000을 더한 값을 연도로 간주한다. (2000 ~ 2099)
예제1#
iSQL> SELECT TO_CHAR ( '28-DEC-1980', 'YY' ) FROM dual;
TO_CHAR ( '28-DEC-1980', 'YY' )
-----------------------------------
80
1 row selected.
iSQL> SELECT TO_DATE ( '28-DEC-80', 'DD-MON-YY' ) FROM dual;
TO_DATE ( '28-DEC-80', 'DD-MON-YY' )
---------------------------------------
2080/12/28 00:00:00
1 row selected.
예제2#
iSQL> CREATE TABLE timetbl(i1 INTEGER, t1 DATE, etc VARCHAR(10));
Create success.
iSQL> INSERT INTO timetbl VALUES (1, SYSDATE, 'Start');
1 row inserted.
iSQL> INSERT INTO timetbl VALUES (2, TO_DATE('2003-02-20 12:15:50', 'YYYY-MM-DD HH:MI:SS'), 'The end');
1 row inserted.
iSQL> SELECT TO_CHAR(T1, 'YYYY YY MM MON Mon mon DD HH MI SS SSSSSS D DDD') Date_format FROM timetbl WHERE I1 = 2;
DATE_FORMAT
------------------------------------------------
2003 03 02 FEB Feb feb 20 12 15 50 000000 5 051
1 row selected.
RR, RRRR, YY, YYYY 비교#
각 형식 요소에 대한 설명을 참고한다.
[YYYY]: 숫자를 그대로 연도로 간주#
-
'23-FEB-5' : 0005년 2월 23일
-
'23-FEB-05' : 0005년 2월 23일
-
'23-FEB-2005' : 2005년 2월 23일
-
'23-FEB-95' : 0095년 2월 23일
[YY]: 2000 + YY#
YY에 2000을 더한다.
-
'23-FEB-5' : 2005년 2월 23일
-
'23-FEB-05' : 2005년 2월 23일
-
'23-FEB-2005': 에러
-
'23-FEB-95' : 2095년 2월 23일
- '23-FEB-05' : 2005년 2월 23일
- '23-FEB-2005': 에러
- '23-FEB-95' : 2095년 2월 23일
[RRRR]: 4자리 숫자를 그대로 연도로 간주#
숫자가 50 미만인 경우 2000을, 50 이상 100 미만인 경우 1900을 더한다.
-
'23-FEB-5' : 2005년 2월 23일
-
'23-FEB-05' : 2005년 2월 23일
-
'23-FEB-2005': 2005년 2월 23일
-
0'23-FEB-95' : 1995년 2월 23일
-
'23-FEB-100': 0100년 2월 23일
-
'23-FEB-0005': 0005년 2월 23일
[RR]: 숫자가 50 미만인 경우 2000을, 50 이상 100 미만인 경우 1900을 더한다.#
-
'23-FEB-5' : 2005년 2월 23일
-
'23-FEB-05' : 2005년 2월 23일
-
'23-FEB-2005': 에러
-
'23-FEB-95' : 1995년 2월 23일
YYY#
설명#
연도의 마지막 숫자 3자리를 반환한다. 21세기라고 가정하고 2000을 더한 값을 연도로 간주한다. (2000 ~ 2099)
Y#
설명#
연도의 마지막 숫자를 반환한다. 21세기라고 가정하고 2000을 더한 값을 연도로 간주한다. (2000 ~ 2099)
IYYY, IYY, IY, I#
설명#
ISO 8601 표준에 따른 연도를 나타낸다. 주의 시작은 월요일이며, 첫 번째 주는 해당 연도의 첫 번째 목요일을 포함한다.
IYYY는 ISO 표준 연도를 반환한다.
IYY는 ISO 표준 연도의 마지막 3자리를 반환한다.
IY는 ISO 표준 연도의 마지막 2자리를 반환한다.
I는 ISO 표준 연도의 마지막 1자리를 반환한다.
TO_DATE 함수에서 사용할 수 없다.
- 2012.12.31(월) ~ 2013.01.06(일) : 2013년
- 2014.12.29(월) ~ 2015.01.04(일) : 2015년
- 2015.12.28(월) ~ 2016.01.03(일) : 2015년
- 2016.12.26(월) ~ 2017.01.01(일) : 2016년
예제#
iSQL> SELECT TO_CHAR ( '1-JAN-2017', 'IYYY IYY IY I' ) FROM dual;
TO_CHAR('1-JAN-2017','IYYY IYY IY I')
--------------------------------------------
2016 016 16 6
1 row selected