ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SMALLDATETIME 과 DATETIME의 아키텍처
    SQL Server/Architecture 2011. 4. 21. 18:43
    참고 URL: http://msdn.microsoft.com/ko-kr/library/ms187819(SQL.90).aspx

    아키텍처를 좀더 자세히 분석해보겠습니다.

    DATETIME = >8 byte (앞에 4 byte 는 1900-01-01 이후의 날짜 수, 그 후에 4 byte는 1/300초의 수)
    SMALLLDATETIME => 4byte(앞에 2byte 는 1900-01-01 이후의 날짜 수, 그 후에 2byte는 00:00:00 ~ 해당일자의 분)

    DECLARE @DATETIME DATETIME
    , @SMALLDATETIME SMALLDATETIME

    SET @DATETIME = '2010-10-20 13:23:57.777'
    SET @SMALLDATETIME = '2010-10-20 13:23:57.777'

    SELECT 
    @SMALLDATETIME
    , CONVERT(VARBINARY,@SMALLDATETIME)
    , @DATETIME
    , CONVERT(VARBINARY,@DATETIME)

    결과
    2010-10-20 13:24:00 0x9E150324   2010-10-20 13:23:57.777 0x00009E1500DCD0A5


    1. SMALLDATETIME(0x9E150324를 4바이트씩 분해, 날짜: 0x9E15  분: 0x0324)
    SELECT DATEADD(DAY,CONVERT(INT,0x9E15),'1900-01-01'), DATEADD(MI,CONVERT(INT,0x0324),CONVERT(SMALLDATETIME,'2010-10-20 00:00:00'))

    --결과
    2010-10-20 00:00:00.000 2010-10-20 13:24:00



    2. DATEIME(0x00009E1500DCD0A5) 4바이트씩 분해=> 날짜: 0x00009E15  1/300초: 0x00DCD0A5

    날짜: 0x00009E15 => SMALLDATETIME 과 같음
    1/300초: 0x00DCD0A5 => SELECT CONVERT(INT,0x00DCD0A5) => 14471333
    1초를 300개로 표현할 수 있으므로 1분은 300*60개, 1시간은 300*60*60으로 표현
    13:23:57.777 이므로

    SELECT (300*60*60*13) + (300*60*23) + (300*57) + 233 => 1447133 입니다.

    233은.. 0.777을 표현한 수 입니다.


    날짜 형식은 반올림이 되므로..  '2010-10-20 13:23:57.777'의 SMALLDATETIME 값은...  '2010-10-20 13:24:00' 이 됩니다.
    DATETIME 값도... 1/100 초 단위가.. 000,003,007만 표시되므로... 

    SELECT CONVERT(DATETIME, '2010-10-20 13:23:57.998') => 내림으로 2010-10-20 13:23:57.997
    SELECT CONVERT(DATETIME, '2010-10-20 13:23:57.999') => 반올림으로 2010-10-20 13:23:58.000



    아래글 출처명 : inside SQL Server 2005 T-SQL Programming 책에서 재구성함(번역자)
    추가로 SQL Server가 1753년 부터 지원하게 되는데.. 그 역사를 알면 재미 있습니다. 참고해서 보세요.


    DATETIME에서 지원하는 가장 빠른 날짜가 1753년인 이유는?

    - Tibor Karaszi, SQL Server MVP, Solid Quality Learning



    좋은 질문이다. 이 제한사항에는 역사적인 이유가 있다. 서양에서는 두 개(줄리안력과 그레고리안력)의 달력을 사용해왔다. 어느 세기를 보느냐에 따라 줄리안력과 그레고리안력은 몇 일 정도의 차이가 났었고, 줄리안력에서 그레고리안력으로 표준을 변경하면서 약 10-13일 정도가 제거되었다. 대영제국에서는 1752년 줄리안력에서 그레고리안력으로 표준을 변경하였다.(그래서 1752년에는 1752년 9월 2일 다음 날이 1752년 9월 14일이 되었다.)

    Microsoft SQL Server의 전신인 Sybase SQL Server에서도 시스템에서 지원하는 가장 빠른 날짜는 1753년이었다. 그 이유는 1753년 이전의 데이터를 입력하기 위해서는, 어느 나라에서 어떤 달력을 사용하는지를 알아야만 하고, 그 선택에 따라 각각 10-13일의 오차를 보정해 주어야 하기 때문이었다. 그래서 Sybase에서는 1753년 이전의 데이터에 대해서는 지원하지 않는 것으로 의사결정하였다. 또한, 1752년 이후에 줄리안력에서 그레고리안력으로 표준을 변경한 나라도 있다. 예를 들어, 터키 같은 나라는 1927년부터 그레고리안력을 표준으로 사용하기 시작했다. 

    스웨덴이 가장 독특한 방법으로 줄리안력에서 그레고리안력으로 표준을 변경하였다. 스웨덴에서는 원래 1700년부터 1740년까지 40년 동안 4년마다 돌아오는 윤일(2월 29일)을 건너뛰는 방법으로, 1740년이후에 그레고리안력과 동기화하려고 계획하였다.(결국은 1740년에 동기화되지는 않았다.) 하지만, 1704년과 1708년에는 몇 가지 이유로 윤일을 건너뛰지 않았고, 결국, 윤년이었던 1712년에 하루를 추가하고(2월 30일에 태어난 사람을 생각해 보라!), 1753년에 하루의 차이를 추가로 보정하여, 동일한 조건을 맞추게 되었다

Designed by Tistory.