comnic's Dev&Life

[SQL SERVER]데이터 타입(date, time, datetime, datetime2, datetimeoffset, smalldatetime)의 종류와 선택 본문

MS-SQL

[SQL SERVER]데이터 타입(date, time, datetime, datetime2, datetimeoffset, smalldatetime)의 종류와 선택

comnic 2019. 4. 26. 07:14
반응형

대부분의 데이터 기록에는 날짜가 들어가기 마련입니다. 기록과 수정에 대한 날짜가 대부분 일 것입니다. 그리고 이러한 날짜를 통해 정렬을 하거나 범위, 연산 등을 하여 데이터를 뽑아 올 것입니다. 여기에서 우리는 늘 여러 데이터 타입과 형식들에 대해 고민하게 되죠.

간단한 기준이 있다고 한다면 고민을 줄일 수 있을 것이라 생각되어 정리 해 봅니다.

타입들에 대한 정의를 먼저 간략히 살펴보겠습니다.

자료형

내용

길이/크기

비고

date

[년-월-일]표기, YYYY-MM-DD

3Byte

[2019-04-26]

time

24시간 기준의 시간.
[시:분:초.100ns]

5Byte

[09:00:00.1234567]

datetime

날짜와 시간 표시
1953년 1월 1일부터 가능.
[년-월-일 시:분:초.123]

8Byte

[2019-04-26 09:00:00.007]


- 1953년 이전의 날짜를 저장하지 못하며(에러 발생), 초 이하의 정확도가 떨어짐.
- .000, .003 또는 .007초 단위로 반올림됩니다.
- SQL표준에 맞지 않고, 정확도가 떨어져서 공식문서에서는 권장하지 않음.

datetime2

[년-월-일 시:분:초[.100ns]],
[YYYY-MM-DD hh:mm:ss[.소수자릿수 초]]

자릿수가 3보다 작은 경우 6Byte
자릿수가 3 또는 4인 경우 7Byte
기타 8Byte

[2019-04-26 09:00:00.1234567]

- SQL Server 2008부터 지원.

datetimeoffset

[년-월-일 시:분:초[.100ns] [표준시간대 [{+|-}hh:mm]],
[YYYY-MM-DD hh:mm:ss[.소수자릿수 초] [+09:00]]

8 ~ 10Byte

표준 시간대를 인식하며 24시간제를 기준으로 하는 시간과 결합된 날짜를 정의합니다.

smalldatetime

[년-월-일 시:분:00]

4Byte

날짜와 시간을 정의 하며, 초는 0으로 표시.(초는 30초를 기준으로 반올림 한다.)
1900-01-01 ~ 2079-06-06까지만 지원.

간단히 살펴 보았으며, 자세한 내용은 공식 문서인 아래 링크를 참고하시기 바랍니다.

https://docs.microsoft.com/ko-kr/sql/t-sql/data-types/smalldatetime-transact-sql?view=sql-server-2017

 

smalldatetime(Transact-SQL) - SQL Server

smalldatetime(Transact-SQL)smalldatetime (Transact-SQL) 이 문서의 내용 --> 적용 대상: SQL Server(2008부터) Azure SQL Database Azure SQL Data Warehouse 병렬 데이터 웨어하우스 APPLIES TO: SQL Server (starting with 2008) Azure SQL Database Azure SQL Data Warehouse Parallel Data Wa

docs.microsoft.com

이제 이를 어떤 기준에서 사용할 것인지 간단하게 정리해 보고자 합니다.

1. 단순 날짜기록이 의미. 특히 과거의 데이터 정리 등.

Type : date, 혹은 기존 데이터 형식과 동일.

간단히 date형식으로 지정해도 문제가 없을 것 같습니다. 이미 정해져 있는 시간의 데이터를 기록하는 것이기에 더욱 그러하고, 기존의 데이터가 정확도 측면에서 더 정밀하더라도 필요에 따라 만들 수 있을 듯 합니다.

2. 많지 않은 데이터 입력과 잦지 않은 수정의 데이터.

Type : smaldatetime

초 단위의 우선순위가 중요하지 않은 경우에 적합할 듯 합니다. 그리고, 2079년 이전까지만 사용한다면.

3. 입력이 초 단위를 넘어가지 않고, 데이터의 우선순위가 중요하지 않은 경우.

물론 입력된 id로 우선 순위를 판별할 수 있으나, 정확한 입력시점이 중요한 경우가 아니라면...

Type : datetime2, datetimeoffset

4. 초당 수십건 이상의 데이터가 기록되거나, 수정이 빈번한 경우.

Type : datetime2, datetimeoffset

3,4의 경우는 동일하게 설정을 해도 괜찮을 것 같습니다. 효율적인 면에서 저장공간과 처리 속도를 생각하면서 길이 값을 조절한다면 충분할 것 같습니다. datetime은 위 표에서 말씀드렸듯이, 더이상 권고하지 않는 것 같습니다. 

 

datetime에 대한 예시를 몇가지만 살펴보겠습니다.

1. date

DECLARE @date date= '2019-04-26 09:01:00.1234567';  
DECLARE @datetime datetime= @date;  
  
SELECT @date AS '@date', @datetime AS '@datetime';

DECLARE @date date= '2019-04-26 09:01:00.1234567';  
DECLARE @datetime datetime2= @date;  
  
SELECT @date AS '@date', @datetime AS '@datetime';

위 두 예시의 차이를 찾으셨나요?
먼저 의미를 보시면, date형식에 값을 넣는데, 포함할 수 없는 시간 이후의 데이터를 짤리는 것을 알 수 있습니다.
그리고 두 그림의 차이점은 중간에 대입할 때의 자료형이 datatime과 datetime2라는 것입니다. 정확도면에서 일단 차이가 나죠!

 

2. datatime

datetime의 경우 SQL표준과 정확도 문제로 요즘은 권고하지 않는다고 했습니다. 아래 예시를 보시죠.

DECLARE @datetime0 datetime = '2019-04-26 09:01:01.120';
DECLARE @datetime1 datetime = '2019-04-26 09:01:01.121';  
DECLARE @datetime2 datetime = '2019-04-26 09:01:01.122';  
DECLARE @datetime3 datetime = '2019-04-26 09:01:01.123';
DECLARE @datetime4 datetime = '2019-04-26 09:01:01.124';  
DECLARE @datetime5 datetime = '2019-04-26 09:01:01.125';  
DECLARE @datetime6 datetime = '2019-04-26 09:01:01.126';
DECLARE @datetime7 datetime = '2019-04-26 09:01:01.127';
DECLARE @datetime8 datetime = '2019-04-26 09:01:01.128';  
DECLARE @datetime9 datetime = '2019-04-26 09:01:01.129';  

SELECT @datetime0 as "0", @datetime1 as "1", @datetime2 as "2", @datetime3 as "3",
  @datetime4 as "4", @datetime5 as "5", @datetime6 as "6",
  @datetime7 as "7", @datetime8 as "8", @datetime9 as "9";

소숫점 이하 3자리를 표시하나 아래와 같이 범위로 표시되는 것을 알 수 있습니다.

- 끝자리 0~1의 경우 0으로 표시.
- 끝자리 2~4의 경우 3으로 표시.
- 끝자리 5~8의 경우 7로 표시.
- 끝자리 9의 경우 0으로 표시.

 

3. datetime2

DECLARE @datetimeoffset datetimeoffset(7) = '2019-04-26 09:01:01.1234567 +10:0';
DECLARE @datetime2 datetime2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset'; 

datetime2의 경우 소숫점 7자리까지 정확도가 표시 되었으며, offset은 짤린 것을 볼 수 있습니다.

 

 

반응형
Comments