일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 텐더민트
- 쌈채소
- Feign
- rust
- for
- 구피
- 카디날
- 반복문
- 기본문법
- 치비
- RSA
- golang 강좌
- rust 소개
- did
- 분산 식별자
- Config server
- 체리새우
- 애플 달팽이
- Tendermint
- 분산 신원
- MSA
- PKI
- 물생활
- 주말농장
- Python 강좌
- 조건문
- rust 강좌
- 무화과
- 가재
- MSSQL
- Today
- Total
comnic's Dev&Life
[SQL SERVER]데이터 타입(date, time, datetime, datetime2, datetimeoffset, smalldatetime)의 종류와 선택 본문
[SQL SERVER]데이터 타입(date, time, datetime, datetime2, datetimeoffset, smalldatetime)의 종류와 선택
comnic 2019. 4. 26. 07:14대부분의 데이터 기록에는 날짜가 들어가기 마련입니다. 기록과 수정에 대한 날짜가 대부분 일 것입니다. 그리고 이러한 날짜를 통해 정렬을 하거나 범위, 연산 등을 하여 데이터를 뽑아 올 것입니다. 여기에서 우리는 늘 여러 데이터 타입과 형식들에 대해 고민하게 되죠.
간단한 기준이 있다고 한다면 고민을 줄일 수 있을 것이라 생각되어 정리 해 봅니다.
타입들에 대한 정의를 먼저 간략히 살펴보겠습니다.
자료형 |
내용 |
길이/크기 |
비고 |
date |
[년-월-일]표기, YYYY-MM-DD |
3Byte |
[2019-04-26] |
time |
24시간 기준의 시간. |
5Byte |
[09:00:00.1234567] |
datetime |
날짜와 시간 표시 |
8Byte |
[2019-04-26 09:00:00.007]
|
datetime2 |
[년-월-일 시:분:초[.100ns]], |
자릿수가 3보다 작은 경우 6Byte |
[2019-04-26 09:00:00.1234567] - SQL Server 2008부터 지원. |
datetimeoffset |
[년-월-일 시:분:초[.100ns] [표준시간대 [{+|-}hh:mm]], |
8 ~ 10Byte |
표준 시간대를 인식하며 24시간제를 기준으로 하는 시간과 결합된 날짜를 정의합니다. |
smalldatetime |
[년-월-일 시:분:00] |
4Byte |
날짜와 시간을 정의 하며, 초는 0으로 표시.(초는 30초를 기준으로 반올림 한다.) |
간단히 살펴 보았으며, 자세한 내용은 공식 문서인 아래 링크를 참고하시기 바랍니다.
이제 이를 어떤 기준에서 사용할 것인지 간단하게 정리해 보고자 합니다.
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은 짤린 것을 볼 수 있습니다.
'MS-SQL' 카테고리의 다른 글
[SQL-SERVER]조건에 따른 값(IF, CASE ~ WHEN) (0) | 2019.04.29 |
---|---|
[SQL SERVER]페이징처리(paging) - OFFSET ROWS FETCH (0) | 2019.04.21 |