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ę.

Odpowiedz

Twój adres email nie zostanie opublikowany.