Typy daty i czasu w SQL Server 2008

19-Maj-2011

Serwer SQL w wersji 2008 oferuje tyle typów związanych z czasem! Date, Time, stary, poczciwy DateTime, DateTime2, DateTimeOffset i wreszcie SmallDateTime. Uff dużo tego. Zacznijmy od zobaczenia tych typów w akcji:

SELECT CAST(SYSDATETIME() AS DATE)
SELECT CAST(SYSDATETIME() AS TIME)
SELECT CAST(SYSDATETIME() AS DATETIME)
SELECT CAST(SYSDATETIME() AS DATETIME2)
SELECT CAST(SYSDATETIME() AS DATETIMEOFFSET)
SELECT CAST(SYSDATETIME() AS SMALLDATETIME)


Oto wynik:

----------
2011-05-19
21:27:47.0066781
2011-05-19 21:27:47.007
2011-05-19 21:27:47.00
2011-05-19 21:27:47.0066781 +00:00
2011-05-19 21:28:00

Pierwszy typ – date – obsługuje daty od 01.01.0001 do 31.12.9999. Właściwie to tyle nam powinno wystarczyć. Jeżeli chodzi o datę wystawienia faktury, dzień przyjęcia środka trwałego do eksploatacji itp. To trudno życzyć sobie czegoś więcej. Przed tą datą komputerów nie było na świecie, więc co na sto obchodzi, zaś daty 31.12.9999 też z pewnych względów nie przekroczymy…
Typ time zapamiętuje czas. I to jak dokładnie! Można tu zapisać czas z dokładnością do 100 nanosekund. Kto potrzebuje aż  takiej precyzji?
Typ datetime jest starym typem obecnym w SQL już od dawna. Skleja on w jedną całość i datę i czas. Jest to stary typ i nie zaleca się aby z niego korzystać. Z jednej strony nie zapamiętuje dobrze daty, bo twierdzi, że początek świata jest 01.01.1753 roku, a koniec świata nastąpi 31.12.9999 (co jeszcze można zrozumieć). Z czasem nie jest lepiej… Zapamiętuje czas z dokładnością do 3.33 milisekundy. Tyle zostało miejsca w batach przeznaczonych do zapamiętania tego typu, więc tyle wykorzystali…
Typ datetime2 to następca typu datetime. Ten typ też skleja datę i czas ale robi to od 01.01.0001 do 31.12.9999 z precyzją czasu jak typ time. Jeżeli odczuwasz potrzebę zapisania daty i czasu w jednej kolumnie to ten wybór wydaje się być rozsądny.
Datetimeoffset pozwala z kolei zapisać czas z precyzją datetime2, ale… dodatkowo można tu umieścić informację o strefie czasowej, w której zdarzenie miało miejsce. Racja, przecież godzina 13:00 dnia 2011.04.12 występuje w różnych strefach czasowych w różnych chwilach. Tego typu należy więc użyć, gdy zbierasz informacje z różnych stref czasowych (np. zamówienia w międzynarodowej sieci sklepów).
Mamy jeszcze smalldatetime. Można powiedzieć, żę to dość ‘excelowy’ typ czasu. Początek świata mamy 01.01.1900 roku, a koniec świata następuje 06.06.2079 roku. Tej daty może niektórym z nas uda się dożyć. Typ zapisuje godzinę z dokładnością do minuty, co w typowych sytuacjach biznesowych jest wystarczające.

Dodaj komentarz:

Autor: Rafał Kraik