Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-16
제목 DATE 타입의 내부 표현 방식 (INTERNAL REPRESENTATION OF DATE TYPE
DATE 타입의 내부 표현 방식
(INTERNAL REPRESENTATION OF DATE TYPE)
======================================

자료 타입중 DATE는 7바이트로 표현되며, 각 바이트의 구성 형식은 다음과
같습니다.

ㅇ DATE 타입의 구성
=> 년도(2 바이트) + 월/일(각 1 바이트) + 시/분/초(각 1 바이트)

이중 년도는 100년 이상의 부분과 100년 미만의 부분으로 분리되어 각 1바이트
씩으로 기록되며, 각 부분은 기본값(base value)에 차이를 더하여(또는 기원전
년도의 경우 감하여)은 다음과 같이 16진수로 표현됩니다.

(바이트 1-2) 년도 : 0x64 0x64 -> 100년 이상의 단위는 1번 바이트에,
미만의 단위는 2번 바이트에 기록
(바이트 3-4) 월/일 : 0x00 0x00 -> 월은 3번 바이트에, 일은 4번
바이트에 기록
(바이트 5-7) 시/분/초: 0x01 0x01 0x01 -> 시는 5번 바이트에, 분은 6번
바이트에, 초는 7번 바이트에 기록

이중 주의할 사항은

1. 년도의 경우 100(16진수로 64)을 기준으로 하여 기원전은 100에서 감한
값을 표현하고, (예를 들어, 기원전 10년은 16진수로 '64 5A', 기원전
100년은 '63 64'로 표현)
2. 시/분/초의 기본값은 "00 00 00"이 아닌 "01 01 01"이란 점입니다.

예를 들어 "1999년 2월 23일 01시 10분 20초"는 다음과 같이 표현됩니다.

ㅇ 19(00) 년 => 64 + 13(19의 16진수 표현) => 77
ㅇ 99 년 => 64 + 63(99의 16진수 표현) => C7
ㅇ 02 월 => 00 + 02(12의 16진수 표현) => 02
ㅇ 23 일 => 00 + 17(23의 16진수 표현) => 17
ㅇ 01 시 => 01 + 01(01의 16진수 표현) => 02
ㅇ 10 분 => 01 + 0A(10의 16진수 표현) => 0B
ㅇ 20 초 => 01 + 14(20의 16진수 표현) => 15

실례를 들면,

SQL> alter session set nls_date_format = 'SYYYY/MM/DD HH24:MI:SS';
SQL> insert into date_internal values ('1999/2/23 1:10:20');
SQL> select * from date_internal;

A
----------------------------------------
1999/02/23 01:10:20

SQL> select dump(a, 16) from date_internal;

DUMP(A,16)
---------------------------------------------------------------------
Typ=12 Len=7: 77,c7,2,17,2,b,15

참고로 DATE 타입의 표현범위는 다음과 같이 기원전 4712년 부터 9999년
까지이며, 만일 허용 범위를 벗어나면 ORA-1841, "(full) year must be
between -4713 and +9999, and not be 0" 오류가 발생합니다.

"-4712/01/01 00:00:00" ~ "9999/12/31 23:59:59"

추가로 몇가지 예제 표현을 소개합니다.

SQL> select a, dump(a,16) "B" from date_internal;

A B
------------------------- ----------------------------------------
-4712/01/01 00:00:00 Typ=12 Len=7: 35,58,1,1,1,1,1
-0100/01/01 00:00:00 Typ=12 Len=7: 63,64,1,1,1,1,1
-0001/01/01 00:00:00 Typ=12 Len=7: 64,63,1,1,1,1,1
0001/01/01 00:00:00 Typ=12 Len=7: 64,65,1,1,1,1,1
1999/02/23 01:10:20 Typ=12 Len=7: 77,c7,2,17,2,b,15
9999/12/31 23:59:59 Typ=12 Len=7: c7,c7,c,1f,18,3c,3c
Comment
등록된 코멘트가 없습니다.