Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Użycie datetime2 w kolumnach czasowych

Termin Definicja
Użycie datetime2 w kolumnach czasowych

DATETIME2 w kolumnach czasowych oferuje szerszy zakres dat i wyższą precyzję niż starszy typ DATETIME.

Zakres dat i precyzja typu datetime2

datetime2 jest typem danych Microsoft SQL Server przeznaczonym do przechowywania daty i czasu bez informacji o strefie czasowej. W porównaniu ze starszym typem datetime obsługuje daty od 1 stycznia 0001 roku do 31 grudnia 9999 roku. Typ datetime ma węższy zakres: zaczyna się od 1 stycznia 1753 roku. Różnica ma znaczenie przy zapisywaniu bardzo starych dat, wartościach używanych w systemach archiwalnych oraz przy integracji z aplikacjami, których biblioteki operują na pełnym zakresie kalendarza gregoriańskiego.

Dokładność ułamkowej części sekundy określa parametr precyzji zapisany w nawiasie, na przykład datetime2(3) albo datetime2(7). Dozwolone wartości mieszczą się w zakresie od 0 do 7. Przy precyzji 0 przechowywane są sekundy bez części ułamkowej, natomiast datetime2(7) pozwala zapisać siedem cyfr po separatorze dziesiętnym sekundy, czyli dokładność do 100 nanosekund. Precyzja określa rozdzielczość przechowywanej wartości, ale nie gwarantuje, że zegar systemu lub aplikacja rzeczywiście dostarczy pomiar o takiej dokładności.

Dobór precyzji i zajętość miejsca

SQL Server dobiera rozmiar przechowywanej wartości datetime2 zależnie od zadeklarowanej precyzji. Dla precyzji od 0 do 2 typ zajmuje 6 bajtów, dla precyzji od 3 do 4 zajmuje 7 bajtów, a dla precyzji od 5 do 7 zajmuje 8 bajtów. Z tego powodu deklarowanie datetime2(7) dla każdej kolumny nie zawsze jest uzasadnione. Jeżeli aplikacja zapisuje czas tylko z dokładnością do milisekund, datetime2(3) może zapewnić wystarczającą dokładność przy mniejszym rozmiarze danych.

Typową definicją kolumny może być created_at datetime2(3) NOT NULL, gdy system rejestruje zdarzenia z dokładnością do milisekund. Dla danych wymagających pełnej precyzji obsługiwanej przez SQL Server można użyć datetime2(7). Precyzję należy ustalić przed utworzeniem tabel i indeksów, ponieważ jej późniejsza zmiana może wymagać modyfikacji tabeli, przebudowy indeksów oraz sprawdzenia zgodności z kodem aplikacji, procedurami składowanymi i integracjami.

Wartości domyślne i pobieranie bieżącego czasu

Kolumnę datetime2 można uzupełniać wartością dostarczaną przez aplikację albo ograniczeniem DEFAULT. W SQL Server funkcja SYSDATETIME() zwraca bieżącą datę i czas jako datetime2(7), natomiast SYSUTCDATETIME() zwraca bieżący czas UTC również jako datetime2(7). Przykładowa definicja created_at datetime2(7) NOT NULL CONSTRAINT DF_table_created_at DEFAULT SYSUTCDATETIME() ustawia czas utworzenia rekordu po stronie serwera, jeżeli instrukcja INSERT nie poda własnej wartości.

Funkcje GETDATE() i GETUTCDATE() zwracają wartości typu datetime, dlatego przy kolumnach datetime2 właściwsze jest użycie odpowiednio SYSDATETIME() lub SYSUTCDATETIME(). Wybór czasu lokalnego albo UTC powinien być jednolity w całej bazie. datetime2 samodzielnie nie przechowuje offsetu, nazwy strefy ani informacji o zmianie czasu letniego. Jeżeli aplikacja musi zachować przesunięcie względem UTC, w SQL Server przeznaczony jest do tego typ datetimeoffset, a nie datetime2.

Filtrowanie, indeksy i diagnostyka kolumn czasowych

Kolumny datetime2 dobrze nadają się do filtrowania zakresów, na przykład wyszukiwania rekordów utworzonych między dwiema wartościami. W zapytaniach warto stosować przedziały półotwarte, takie jak created_at >= @from AND created_at < @to, zamiast konstruować koniec dnia za pomocą wartości 23:59:59.999. Takie podejście nie zależy od wybranej precyzji kolumny i nie pomija rekordów zapisanych z ułamkową częścią sekundy. Parametry zapytania powinny mieć typ zgodny z kolumną, aby ograniczyć niejawne konwersje.

Indeks na kolumnie datetime2 może przyspieszyć wyszukiwanie po czasie, sortowanie oraz pobieranie najnowszych rekordów, ale jego użyteczność zależy od rozkładu danych i konstrukcji zapytania. Należy sprawdzić plan wykonania, szczególnie gdy kolumna jest opakowana funkcją, na przykład CONVERT(date, created_at), ponieważ przekształcenie wartości w warunku może utrudnić wykorzystanie zwykłego indeksu. Podczas diagnostyki trzeba także zweryfikować, czy aplikacja nie obcina części ułamkowej, czy sterownik poprawnie mapuje typ SQL Server oraz czy wartości są zapisywane w oczekiwanej strefie czasowej.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę