SQL Server는 날짜 및 시간 안에 깊은 저장

SQL 서버의 내장 스토리지에서, 날짜와 시간 문자열로 저장하지만, 저장하는 정수를 사용하지 않습니다. 날짜 부분과 시간 오프셋 부분을 구분하고, 특정한 형식을 사용하여 실제 기준 날짜 데이터 및 기준 시간을 복원.

A, 날짜 시간 내부 스토리지

은 SQL Server 엔진 날짜 시간 종류를 저장하는 것은 상기 기준 기간과 관련하여 저장된 INT32 2 총 8 바이트, 제 정수 INT32 (처음 4 바이트)로 저장된다 (1900-01-01)의 오프셋 날짜이고 양. 상기 기준 날짜 1900-01-01 현재 4 바이트 0 날짜 년 1 월 1, 1900이다. INT32 2 정수 (4 바이트)는 클럭 수가 자정 (: 00.000 : 00) 후 진드기 저장되고, 각 눈금은 3.33 밀리 초의 정확도로, 1/300 초 (0.00333 초 3.33ms) 따라서, 날짜 시간 시간이 표현 될 수 있고, 눈금의 시간 에러가있을 수있다.

날짜 시간 내부 저장 형식은 16 진수이다 DDDDTTTT

  • DDDD는 2 바이트를 차지하며이 기준 날짜의 오프셋을 나타냅니다
  • TTTT : 항상 자정 이후 틱 수를 나타내는 2 바이트를 차지

예를 들어, 다음 날짜 및 시간, 날짜 시간 유형 크기를 변환하는 두 개의 1 바이트의 각각에 대응하는 8 바이트의 16 진 숫자이다 :

선언  @dt  날짜  =  ' : 05 23.187 2015년 5월 7일 10 ' 
을 선택  변환 ( VARBINARY ( 8 ), @dt ) date_time_binary
 --output 0x0000A49100A6463C

1, 날짜와 시간 분해능

두 부분으로 바이너리 포맷 바이트 스플릿 시간 : 날짜 처음 네 바이트, 4 바이트 타임이 결과는 다음이다 :

선언  @dt  날짜  =  ' 2015년 5월 7일 10 : 05 : 23.187 '

선택  부분 문자열 ( 변환 ( VARBINARY ( 8 ) @dt ), 1 , 4 ) 와 같은 date_binary,
    캐스팅 ( 서브 스트링 ( 변환 ( VARBINARY ( 8 ) @dt ), 1 , 4 ) 으로서  INT ) date_int,
    서브 스트링 ( 변환 ( VARBINARY ( 8 ) @dt ), (5) , (4)) 로서 time_binary,
    캐스팅 ( 서브 스트링 ( 변환 ( VARBINARY ( 8 ) @dt ), 5 , 4 ) 으로서  INT )  time_int;

 2가 감소하여 날짜 및 시간 오프셋

기준 시간 및 일본어 일시로 되돌릴 오프셋 정수 :

선언  @Time의 시간을 = ' 00 : 00 : 00.000를 ' 
선언  @date 날짜 = ' 1900-01-01을 '

선택  DATEADD (  , 42,129 , @date ) originl_date
    , DATEADD (MS, 10,896,956 * 10 / 3 , @Time )  original_time

두, DATETIME2 내부 스토리지

N의 소수 초의 정확도가 독립적으로 설정 저장 사이즈 (저장 면적)이, DATETIME2 (n)의 저장 공간 부분 초간 고정되지 수 있기 때문에 DATETIME2 (n)의 데이터 유형을 저장 날짜와 시간, 그것은, 날짜 시간의 업그레이드 된 버전 정밀도의 관계는 :

  • DATETIME2가 (N) 내부에 저장된 제 N 바이트 저장 정밀도 일시 저장 값 후속 바이트.
  • 경우 소수 제 N의 정확성 <3, 전체 저장 공간 (1B) (정밀도) +6 B (데이터);
  • n이 3 초 분별 정밀도 - 4 전체 저장 공간 (1B) (정밀도) + (7B) (데이터);
  • 경우 n은 소수 초 정밀도 5--7, 전체 저장 공간 (1B) (정밀도) + (8B) (데이터), 최대 초 분별 정밀도가 7이며, 디폴트 값은 7이다;

1 진 역방향

내부 메모리의 DATETIME2 (N)를 탐구하기 전에 바이트 처음 봐 "리틀 엔디안"형식과 "빅 엔디안"형식으로 저장 :

  • 빅 엔디안 포맷은 : 상위의 데이터 반면 로우 어드레스가 메모리에 저장되고, 높은 어드레스 메모리에 저장된 하위 비트의 데이터를 지칭하며
  • 리틀 엔디안 포맷 : 고차 데이터 주소의 메모리에 저장되어있는 동안, 낮은 메모리 어드레스에 저장되어있는 하위 비트의 데이터를 말한다.

예를 들면, 좌측에 메모리 어드레스의 상태에서, 우측이 높으면 저장하는 2 바이트를 사용하여 디지털 275 :

  • 바이트 순서 0x0113입니다 : 빅 엔디안 형식은 경우
  • 바이트 순서 0x1301입니다 : 리틀 엔디안는 경우

내부 저장 포맷이 사용될 DATETIME2 (N)는 CPU 작업에 적합 리틀 엔디안 포맷이다.

2 DATETIME2 저장 형식

내부 저장 형식 DATETIME2 (N)이있다 :

  • 저장된 정밀도 (N)의 첫번째 바이트
  • 기준 날짜 0001-01-01, 리틀 엔디안 후 일수에서 세 바이트 기록 후.
  • 심야 시간 간격 (시간 단위 간격, TUI), 리틀 엔디안 후 상기 중간 기록 단위 후에 남은 바이트 수.

TUI 10 TUI의 매 n 번째 전력의 정밀도로 제어되는, 즉, 1 초 :

  • DATETIME2 (7)의 경우는 100ns의 TUI이고;
  • DATETIME2 (6)의 경우, TUI는 1 마이크로 초 (= 1000ns)이고;
  • DATETIME2 (5)의 경우, TUI 10 마이크로 초이고;
  • DATETIME2 (4)의 경우, TUI 100 마이크로 초;
  • DATETIME2 (3)의 경우는 1ms의 TUI (1 밀리 초 = 1000 초)이고;

조작의 용이성을 위해, DATETIME2 (N) 역순 바이트 스트림 : 제 3 바이트는 일수 마지막 바이트가 TUI의 나머지 바이트의 중간 수치의 정밀도 나타낸다. 처음 3 바이트는 마지막 후의 기준 날짜 0001-01-01로부터 일수에 저장된 정밀도, n은 예를 들어, 수납 공간의 반전에 따라 상기 바이트 스트림 후 DATETIME2 (7) ~ 9 바이트 로부터 중간 다섯 바이트 TUI 자정의 수를 시작합니다.

2 이진 저장 DATETIME2로 변환되고

DATETIME2 이진 저장을 변환하고, 역방향 프로세스, DATETIME2 (3) (3)의 정확도는, 저장 공간이 상기 기준 날짜 0001-01-01로부터 일수 후 기록 8 바이트, 3 바이트 3 전 후이다 바이트는 자정 TUI에서 얼마나 많은 시작을 나타냅니다.

선언  @dt DATETIME2 ( 3 ) = " 05 : 10 2015년 5월 7일 23.187은 ' 
선언  @dt_bi  VARBINARY을 ( 최대 ) = 변환 ( VARBINARY ( 최대 ) @dt는 ) 
 선택  @dt_bi를  같이 date_time_binary
    , 변환 ( VARBINARY ( 최대 ),  ( @dt_bi를 ))  reverse_binary

각 성분의 DATETIME2 (3)으로 분해 이진 값 :

선언  @dt DATETIME2 ( 3 ) = ' : 05 23.187 2015년 5월 7일 10 ' 
선언  @dt_bi  VARBINARY ( 최대 ) = 변환 ( VARBINARY ( 최대 ) @dt ) 
 선언  @dt_bi_littleEnd의  VARBINARY ( 최대 )
 선택  @dt_bi_littleEnd = 변환을 ( VARBINARY ( 최대 ), 리버스 ( @dt_bi ))

선택  부분 문자열 ( 변환 ( VARBINARY ( 8 ), @dt_bi_littleEnd ), 1 , 3 ) date_binary,
    주조 ( 하위 문자열 ( 변환 ( VARBINARY ( 8 ), @dt_bi_littleEnd ), 1 , 3 )  INT ) date_int,
    하위 문자열 ( 변환 ( VARBINARY ( 8 ) @dt_bi_littleEnd ) 4, 4 ) 와 같은 time_binary,
    캐스팅 ( 서브 스트링 ( 변환 ( VARBINARY ( 8 ) @dt_bi_littleEnd ), 4 , 4 )  INT ) time_int,
    서브 스트링 ( 변환 ( VARBINARY ( 8 ) @dt_bi_littleEnd ), 8 , 1 ) precision_binary ,
    주조 ( 하위 문자열 ( 변환 ( VARBINARY( 8 ) @dt_bi_littleEnd ), 8 , 1 ) 로서  INT )  precision_int;

도 3은 오프셋 값을 사용하는 것은 원래의 기준을 복원

오프셋으로, 기준 일시 얻어지는 원래의 값에 추가 될 수있다 : 오프셋

선언  @Time의 시간을 = ' 00 : 00 : 00.000를 ' 
선언  @date 날짜 = ' 0001-01-01을 '

선택  DATEADD (  , 735724 , @date ) originl_date
    , DATEADD (밀리 초, 36323187 , @Time )  original_time

 

 

 

참조 문서 :

은 SQL Server 2008 DATETIME2 내부 구조는 무엇인가?

SQL 서버의 날짜 및 시간 끔찍의 잘못을 얻는 방법

추천

출처www.cnblogs.com/ljhdo/p/10208322.html