Akademia SQL - Część 9: Mechanizm przechytywania zmian     Akademia SQL     Akademia SQL - Część 11: Typy i parametry tabelaryczne

Akademia SQL - Część 10: Nowe typy daty i czasu Udostępnij na: Facebook

Autor: Damian Widera

Opublikowano: 21 października 2008

Zawartość strony
 Nowe typy daty i czasu – informacje podstawowe   Nowe typy daty i czasu – informacje podstawowe
 Nowe typy daty i czasu – laboratorium   Nowe typy daty i czasu – laboratorium
 Nowe typy daty i czasu – referencje   Nowe typy daty i czasu – referencje

Nowe typy daty i czasu – informacje podstawowe

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.

 Do początku strony Do początku strony

Nowe typy daty i czasu – laboratorium

Celem ćwiczenia jest praktyczne zapoznanie się z nowymi funkcjami daty i czasu.

Zadanie 1

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())

 Do początku strony Do początku strony

Nowe typy daty i czasu - referencje

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] Witryna SQL Server 2008 Jumpstart

[4] Pliki pomocy Books Online na temat: Using Date and Time Data


  Damian Widera, Project Manager & Team Lead (MCT, MCITP - DBA, MCSD.NET)
Od 8 lat zajmuje się projektowaniem, tworzeniem i wdrażaniem aplikacji wykorzystujących platformę .NET, SQL Server oraz Oracle. Obecnie pracuje jako project manager dla LGBS Polska. Pracował także jako trener, programista, administrator baz danych, twórca domumentacji oraz analityk biznesowy. Aktywnie współpracuje z polskim oddziałem Microsoft publikując atykuły, webcasty oraz porady z zakresu SQL Server na stronach TechNet. Jest współautorem książki „Serwer SQL 2008. Administracja i programowanie".

Speaker na wielu konferencjach, m.in. Microsoft Heroes Happen Here, C2C, European PASS Conference, Microsoft Technology Summit, Energy Launch, TechED. Od 2004 r. posiada certyfikaty firmy Microsoft: MCT, MCITP-DBA oraz MCSD.NET. Jest współtwórcą oraz liderem jednej z najwiekszych grup pasjonatów SQL Server w Polsce - Śląskiej Regionalnej Grupy Microsoft (PLSSUG Katowice). Od listopada 2008 jest prezesem Polish SQL Server Users Group (PLSSUG) w Polsce. W styczniu 2009 nagrodzony tytułem MVP w kategorii SQL Server.
 Do początku strony Do początku strony

Akademia SQL - Część 9: Mechanizm przechytywania zmian     Akademia SQL     Akademia SQL - Część 11: Typy i parametry tabelaryczne