SQL Server

datetime2, datetime 날짜형 비교

미스터몽키 2018. 9. 29. 02:15

time 형식은 시간만(날짜부분없음) 소수점 7자리까지 표현, 3~5바이트 사용 , 00:00:00부터 23:59:59까지

date 형식은 날짜만(시간부분없음), 3바이트 사용 , 0001-01-01부터 9999-12-31까지

datetime 형식은 초단위 아래 소수점 3자리까지 표현, 8바이트 사용 , 1753-01-01부터 9999-12-31까지

datetime2 형식은 초단위 아래 소수점 7자리까지 표현, 6~8바이트 사용, 0001-01-01부터 9999-12-31까지

smalldatetime 형식은 분단위까지 표현, 4바이트 사용 , 1900-01-01부터 2079-06-06까지


GETDATE() 함수는 datetime 형식을 리턴하고

SYSDATETIME() 함수는 datetime2 형식을 리턴한다.(더 정확하다)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT GETDATE(),       -- 2018-09-29 02:06:56.167
       SYSDATETIME()    -- 2018-09-29 02:06:56.1698423
         
SELECT CONVERT(smalldatetime, GETDATE()),     -- 2018-09-29 02:07:00
       CONVERT(datetime, GETDATE()),       -- 2018-09-29 02:06:56.167
       CONVERT(datetime, SYSDATETIME()),      -- 2018-09-29 02:06:56.170
       CONVERT(datetime2, GETDATE()),       -- 2018-09-29 02:06:56.1670000
       CONVERT(datetime2, SYSDATETIME()),     -- 2018-09-29 02:06:56.1698423
       CONVERT(datetime2(0), SYSDATETIME()),  -- 2018-09-29 02:06:56  
       CONVERT(datetime2(1), SYSDATETIME()),  -- 2018-09-29 02:06:56.2
       CONVERT(datetime2(2), SYSDATETIME()),  -- 2018-09-29 02:06:56.17
       CONVERT(datetime2(3), SYSDATETIME()),  -- 2018-09-29 02:06:56.170
       CONVERT(datetime2(4), SYSDATETIME()),  -- 2018-09-29 02:06:56.1698 
       CONVERT(datetime2(5), SYSDATETIME()),  -- 2018-09-29 02:06:56.16984
       CONVERT(datetime2(6), SYSDATETIME()),  -- 2018-09-29 02:06:56.169842
       CONVERT(datetime2(7), SYSDATETIME()),  -- 2018-09-29 02:06:56.1698423
      CONVERT(time(7), SYSDATETIME()),   -- 02:06:56.1698423
      CONVERT(time(0), SYSDATETIME())    -- 02:06:56



smalldatetime 형식은 년도 범위가 좁고 초단위가 없어서 사용하기 불안하고(혹시 사용자가 2080년을 입력하면 오류가 나서)

그동안 초단위가 필요할 때 datetime 형식을 사용했지만 소수점 아래 3자리까지 불필요하게 가져오게되고 
프로그램에서 마스킹 처리해서 초단위 아래를 안보이게 했었다. 물론 8바이트로 저장되는 것도 부담스럽고

날짜만 필요한 경우 date 형을 사용하듯이 앞으로 초단위까지만 필요할 때  datetime2(0) 형식을 사용해야할 것 같다.  사용하는 바이트도 6바이트로 datetime 형식보다 저장소 크기도 작다.
추가로 시간부분 초단위만 필요한 경우 time(0)을 사용하면된다.

SQL Server 2008부터 date 형식, datetime2 형식 time 형식을 지원한다.