| Nowe typy daty i czasu – informacje podstawowe | |
| Nowe typy daty i czasu – laboratorium | |
| Nowe typy daty i czasu – referencje |
Wcześniejsze wersje silnika baz danych SQL Server miały wbudowane tylko dwa typy daty i czasu: DATETIME i SMALLDATETIME. Obydwa przechowywały informacje zarówno o dacie, jak i o czasie, ale z różną precyzją. Typ DATETIME pozwalał zapisać datę i czas z dokładnością do 1/3 sekundy a typ SMALLDATETIME pozwalał na zapisanie daty z dokładnością do 1 minuty.
W przypadku, gdy była potrzebna informacja tylko o dacie, to należało czas zerować albo do porównywania używać operatora BETWEEN … AND.
Powodowało to nie tylko utrudnienia w aplikacjach bazodanowych, ale miało negatywny wpływ na wydajność serwera, ponieważ dane zajmowały więcej miejsca niż było to potrzebne. Żaden z istniejących w starszych wersjach systemu typów danych nie obsługiwał też stref czasowych, nie pozwał zapisać dat wcześniejszych niż 1 stycznia 1753 roku i nie był wystarczająco dokładny.
Problemy te zostały rozwiązane w serwerze SQL 2008 za pomocą nowych typów daty i czasu:
1. | Typ DATE pozwala zapisać na 3 bajtach daty z zakresu od 1 stycznia 1 roku naszej ery do 31 grudnia roku 9999 liczone według kalendarza gregoriańskiego. Dane domyślnie przechowywane są w formacie RRRR-MM-DD. |
2. | Typ TIME pozwala zapisać na maksymalnie 5 bajtach znaczniki czasu według zegara 24-godzinnego. Możliwe jest określenie dokładności danych jako liczby miejsc po przecinku, a dane domyślnie przechowywane są w formacie GG:MM:SS[.NNNNNNN]. |
3. | Typ DATETIME2 pozwala zapisać na 8 bajtach daty z zakresu od 1 stycznia 1 roku naszej ery do 31 grudnia roku 9999 liczone według kalendarza gregoriańskiego i czas według zegara 24-godzinnego z dokładnością do 100 nanosekund. Dane domyślnie przechowywane są w formacie RRRR-MM-DD GG:MM:SS[.NNNNNNN]. |
4. | Typ DATETIMEOFFSET pozwala zapisać na 8 bajtach daty z zakresu od 1 stycznia 1 roku naszej ery do 31 grudnia roku 9999 liczone według kalendarza gregoriańskiego, czas według zegara 24-godzinnego z dokładnością do 100 nanosekund oraz przesunięcie strefy czasowej — jest to jedyny typ daty i czasu pozwalający na zapisanie dodatkowych informacji o strefie czasowej. |
Dodanie nowych typów daty i czasu okazało się najkosztowniejszą pojedynczą zmianą w SQL Server 2008, ponieważ konieczne było zachowanie kompatybilności z poprzednimi wersjami serwera, a jednocześnie dane nowych typów musiały być prawidłowo przetwarzane przez wszystkie składniki serwera.
Serwer SQL 2008 zawiera nowe funkcje daty i czasu, takie jak SYSDATETIME, SYSUTCDATETIME, SYSDATETIMEOFFSET, SWITCHOFFSET i TODATETIMEOFFSET. Umożliwiają one przetwarzanie informacji o strefach czasowych oraz danych o dużej dokładności:
1. | Funkcja SYSDATETIME zwraca informację o aktualnej dacie i czasie komputera, na którym zainstalowana jest instancja serwera SQL. Informacja ta jest typu DATETIME2(7). |
2. | Funkcja SYSUTCDATETIME zwraca informację o aktualnej dacie i czasie komputera, na którym zainstalowana jest instancja serwera SQL. Informacja ta będzie przedstawiona jako czas UTC (Coordinated Universal Time) w formacie DATETIME2(7), ale precyzję można zmienić podając do funkcji SYSUTCDATETIME paramter od 1 do 6. |
3. | Funkcja SYSDATETIMEOFFSET zwraca informacje o aktualnej dacie i czasie komputera, na którym zainstalowana jest instancja serwera SQL oraz strefie czasowej (przesunięciu względem czasu UTC). Informacja jest typu DATETIMEOFFSET(7). |
4. | Funkcja SWITCHOFFSET zwraca informacje w formacie DATETIMEOFFSET o dacie i czasie, który został zmieniony z jednej strefy czasowej do drugiej. |
5. | Funkcja TODATETIMEOFFSET pozwala na konwersję informacji otrzymanych w formacie DATETIME2 na typ DATETIMEOFFSET. |
Celem ćwiczenia jest praktyczne zapoznanie się z nowymi funkcjami daty i czasu.
1. | Uruchom SQL Server Management Studio (SSMS) i połącz się z serwerem EVALUATION używając uwierzytelnienia WINDOWS. ![]() |
2. | Otwórz nowe okno zapytania (skrót klawiszowy CTRL+N). |
3. | Wpisz poniższe zapytanie, które wyświetli informacje o wszystkich dostępnych w serwerze SQL 2008 typach danych i czasu: SELECT * FROM sys.systypes WHERE (name like '%date%' or name like '%time%') AND name <> 'timestamp' ![]() |
4. | Wpisz poniższe zapytanie, które zwróci informacje o aktualnej dacie i czasie komputera. W zapytaniu użyliśmy istniejących typów danych - DATETIME oraz SMALLDATETIME: DECLARE @Now DATETIME SET @Now = GETDATE() SELECT @Now as [Data i czas w formacie DATETIME] ,CAST(@Now as SMALLDATETIME) as [Data i czas w formacie SMALLDATETIME] --------------------------------------- Data i czas w formacie DATETIME Data i czas w formacie SMALLDATETIME ------------------------------- ------------------------------------ 2008-09-18 07:05:04.033 2008-09-18 07:05:00 (1 row(s) affected) |
5. | Wpisz poniższe zapytanie, które zwróci informacje o aktualnej dacie i czasie komputera. W zapytaniu użyliśmy nowych typów danych - DATE oraz TIME: DECLARE @Date DATE = SYSDATETIME() DECLARE @Time TIME = SYSDATETIME() SELECT @Date as [aktualna data w formacie DATE] ,@Time as [aktualny czas w formacie TIME] --------------------------------------- aktualna data w formacie DATE aktualny czas w formacie TIME ----------------------------- ----------------------------- 2008-09-18 13:17:52.1738902 (1 row(s) affected) |
6. | Wpisz poniższe zapytanie, które zwróci informacje o aktualnej dacie i czasie komputera. W zapytaniu użyliśmy nowego typu danych - DATETIME2 oraz funkcji SYSDATETIME, która zwraca informacje o dacie i czasie z odpowiednią precyzją. Zwróć uwagę, w jaki sposób można zmniejszać precyzję otrzymanego wyniku przy pomocy parametru przekazywanego do typu DATETIME(2) DECLARE @Date2_2 DATETIME2(2) = SYSDATETIME() DECLARE @Date2_7 DATETIME2(7) = SYSDATETIME() SELECT @Date2_2 as [aktualna data w formacie DATETIME2(2)] ,@Date2_7 as [aktualna data w formacie DATETIME2(7)] --------------------------------------- aktualna data w formacie DATETIME2(2) aktualna data w formacie DATETIME2(7) ------------------------------------- ------------------------------------- 2008-09-18 13:24:37.61 2008-09-18 13:24:37.6145456 (1 row(s) affected) |
7. | Na poniższym fragmencie kodu pokazaliśmy możliwości oferowane przez funkcję SYSDATETIMEOFFSET oraz nowe typ danych DATETIMEOFFSET. Zwróć uwagę na możliwości uzyskiwania określonej precyzji wyniku: DECLARE @DTO DATETIMEOFFSET = SYSDATETIMEOFFSET() DECLARE @DTO_1 DATETIMEOFFSET(1) = SYSDATETIMEOFFSET() DECLARE @DTO_3 DATETIMEOFFSET(3) = SYSDATETIMEOFFSET() SELECT @DTO as [data i czas z uwzglednieniem stryfy czasowej, domyslna precyzja] ,@DTO_1 as [data i czas z uwzglednieniem stryfy czasowej, typ DATETIMEOFFSET(1)] ,@DTO_3 as [data i czas z uwzglednieniem stryfy czasowej, typ DATETIMEOFFSET(3)] --------------------------------------- ![]() |
8. | Na poniższym możesz sprawdzić, jak działa funkcja SWITCHOFFSET: DECLARE @OFFSET1 DATETIMEOFFSET(0) = SYSDATETIMEOFFSET(); SELECT @OFFSET1 as [Data i czas komputera] ,SWITCHOFFSET(@OFFSET1 ,'+02:00') as [Data i czas komputera w strefie czasowej +2h] ,SWITCHOFFSET(@OFFSET1 ,'-08:00') as [Data i czas komputera w strefie czasowej -8h] --------------------------------------- ![]() |
9. | Wykonaj poniższe zapytanie, które zawraca informacje, ile wynosi przesunięcie (liczone w minutach) komputera względem czasu UTC: SELECT DATEPART(TZOFFSET,SYSDATETIMEOFFSET()) |
Dodatkowe informacje na temat funkcjonalności TDE można znaleźć w Internecie:
[1] M.Szeliga: "T-SQL 2008 (cz. 2) - Co nowego?"
[2] P.Potasiński - "Co nowego w silniku bazodanowym SQL Server 2008 July CTP (CTP 4), cz. I"
[3] P.Potasiński - "Wstawianie daty i czasu w SQL Server"
[4] Witryna SQL Server 2008 Jumpstart
[5] Pliki pomocy Books Online na temat: Using Date and Time Data
| • |
![]() | Damian Widera, Project Manager & Team Lead (MCT, MCITP – DBA, MCSD.NET) |