Typy danych daty i czasu w SQL Server 2012

SQL Server 2012 udostępnia następujące typy danych daty i czasu:
date, time, datetime, datetime2, datetimeoffset, smalldatetime.

Typ danych date przechowuje datę domyślnie w formacie YYYY-MM-DD . Jest to postać łańcucha znakowego. Precyzja liczby znaków wynosi 10. Ten typ danych zajmuje 3 bajty. Domyślną wartością jest 1900-01-01.

Typ danych time przechowuje czas w formacie hh-mm-ss[.nnnnnnn] bazującym na 24-godzinnym czasie. Jest to postać łańcucha znakowego. Precyzja liczby znaków wynosi 8-16. Ten typ danych zajmuje 5 bajtów. Domyślną wartością jest  00:00:00. Precyzja ułamka sekundy to liczba znaków od 0 do 7.

time and time(7) – liczba znaków to 16 o precyzji 7, zajmuje 5 bajtów,
time(0) – liczba znaków to 8 o precyzji 0 i precyzji ułamka sekund 0-2, zajmuje 3 bajtów,
time(1) – liczba znaków to 10 o precyzji 1 i precyzji ułamka sekund 0-2, zajmuje 3 bajtów,
time(2) – liczba znaków to 11 o precyzji 2 i precyzji ułamka sekund 0-2, zajmuje 3 bajtów,
time(3) – liczba znaków to 12 o precyzji 3 i precyzji ułamka sekund 3-4, zajmuje 4 bajtów,
time(4) – liczba znaków to 13 o precyzji 4 i precyzji ułamka sekund 3-4, zajmuje 4 bajtów,
time(5) – liczba znaków to 14 o precyzji 5 i precyzji ułamka sekund 5-7, zajmuje 5 bajtów,
time(6) – liczba znaków to 15 o precyzji 6 i precyzji ułamka sekund 5-7, zajmuje 5 bajtów.

Poniższy przykład pokazuje różnice dla poszczególnych typów danych czasu :

create table tab
(
v_time time not null, v_time0 time(0) not null,
v_time1 time(1) not null, v_time2 time(2) not null,
v_time3 time(3) not null, v_time4 time(4) not null,
v_time5 time(5) not null,v_time6 time(6) not null,
v_time7 time(7) not null,
);

insert into tab values ( 
  SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET() 
 ,SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET() 
 ,SYSDATETIMEOFFSET(), SYSDATETIMEOFFSET() , SYSDATETIMEOFFSET() 
);

a11

Typ danych smalldatetime przechowuje datę i czas: datę od 1900-01-01 do 2079-06-06 oraz czas od 00:00:00 do 23:59:59. Jest to postać łańcucha znakowego o domyślnym formacie YYYY-MM-DD hh-mm-ss. Precyzja liczby znaków wynosi 19-23. Zaokrąglenie do .000, .003, or .007 ułamka sekundy. Ten typ danych zajmuje 8 bajtów. Domyślną wartością jest 1900-01-01 00:00:00.

Typ danych datetime przechowuje datę i czas: datę od 1753-01-01 do 9999-12-31 oraz czas od 00:00:00 do 23:59:59.997. Jest to postać łańcucha znakowego o domyślnym formacie YYYY-MM-DD hh-mm-ss[.nnn]. Precyzja liczby znaków wynosi maksymalnie 19. Ten typ danych zajmuje 4 bajty. Domyślną wartością jest 1900-01-01 00:00:00.

Typ danych datetime2 przechowuje datę i czas: datę od 0001-01-01 do 9999-12-31 oraz czas od 00:00:00 do 23:59:59.9999999. Jest to postać łańcucha znakowego o domyślnym formacie  YYYY-MM-DD hh-mm-ss[.nnnnnnn]. Precyzja liczby znaków wynosi 19-27, domyślnie jest to 7. Ten typ danych zajmuje 6( dla precyzji mniej niż 3) – 8( dla 5 i większej preyzji ) bajtów. Domyślną wartością jest 1900-01-01 00:00:00.

Typ danych datetimeoffset przechowuje datę i czas: datę od 0001-01-01 do 9999-12-31 oraz czas od 00:00:00 do 23:59:59.9999999 i różnicę strefy czasowej od -14:00 do +14:00. Jest to postać łańcucha znakowego o domyślnym formacie YYYY-MM-DD hh-mm-ss[.nnnnnnn][+|-]HH:mm]. Precyzja liczby znaków wynosi  26-34. Dokładność wynosi 100 nanosekund. Ten typ danych zajmuje 10 bajtów. Domyślną wartością jest 1900-01-01 00:00:00 00:00.

datetimeoffset and datetimeoffset(34,7) – liczba znaków to 34 o precyzji 7
i precyzji ułamka sekund 5-7 ,domyślnie jest to  7, zajmuje 10 bajtów,
datetimeoffset(26,0) – liczba znaków to 26 o precyzji 0
i precyzji ułamka sekund 0-2, zajmuje 8 bajtów,
datetimeoffset(28,1) – liczba znaków to 28 o precyzji 1
i precyzji ułamka sekund 0-2, zajmuje 8 bajtów,
datetimeoffset(29,2) – liczba znaków to 29 o precyzji 2
i precyzji ułamka sekund 0-2, zajmuje 8 bajtów,
datetimeoffset(30,3) – liczba znaków to 30 o precyzji 3
i precyzji ułamka sekund 3-4, zajmuje 9 bajtów,
datetimeoffset(31,4) – liczba znaków to 31 o precyzji 4
i precyzji ułamka sekund 3-4, zajmuje 9 bajtów,
datetimeoffset(32,5) – liczba znaków to 32 o precyzji 5
i precyzji ułamka sekund 5-7, zajmuje 10 bajtów,
datetimeoffset(33,6) – liczba znaków to 33 o precyzji 6
i precyzji ułamka sekund 5-7, zajmuje 10 bajtów.

Poniższy przykład pokazuje różnice dla poszczególnych typów danych daty i czasu :

create table tabd
(
  v_date date not null, 
  v_datetime datetime not null,
  v_datetime2 datetime2 not null, 
  v_datetimeoffset datetimeoffset not null
);

insert into tabd values ( 
  SYSDATETIMEOFFSET() , SYSDATETIMEOFFSET() 
, SYSDATETIMEOFFSET() , SYSDATETIMEOFFSET() 
);

a111

Wybór typu danych daty i czasu powinno być dopasowane do przechowywanej wartości. Jeśli przechowywana wartość musi zawierać strefę czasową, wtedy odpowiednim typem danych jest datetimeoffset, w przeciwnym przypadku należy zastosować jeden z pozostałych typów, tak aby zaoszczędzić miejsce zajmowane przez ten typ danych.  Mniej niepotrzebnych bajtów  przydzielanych dla danej kolumny oszczędza ilość zajmowanego miejsca przez bazę.