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

DATETIME2

Termin Definicja
DATETIME2

DATETIME2 to typ danych SQL Server przechowujący datę i czas z wyższą precyzją niż starszy typ DATETIME.

Zakres i precyzja typu DATETIME2 w SQL Server

DATETIME2 jest typem danych programu Microsoft SQL Server przeznaczonym do przechowywania daty i czasu bez informacji o przesunięciu względem UTC. Łączy część kalendarzową z godziną, minutą, sekundą oraz ułamkiem sekundy. Zakres wartości obejmuje daty od 1 stycznia 0001 roku do 31 grudnia 9999 roku. Jest więc szerszy niż w starszym typie DATETIME, którego zakres zaczyna się dopiero 1 stycznia 1753 roku.

Typ można zadeklarować jako datetime2(p), gdzie parametr p określa liczbę cyfr przechowywanych po separatorze dziesiętnym w części sekundowej. Dozwolony zakres parametru wynosi od 0 do 7, a wartością domyślną jest 7. Przy datetime2(0) przechowywane są pełne sekundy, natomiast datetime2(7) pozwala zapisać czas z dokładnością do 100 nanosekund. Parametr określa dokładność zapisu, a nie gwarantuje, że źródłowy zegar systemowy rzeczywiście dostarczy pomiar o takiej rozdzielczości.

Definicja kolumny, wartości i konwersja

Przykładowa kolumna może mieć definicję utworzono datetime2(3) NOT NULL. Taki zapis przechowuje datę oraz czas z trzema cyframi części ułamkowej sekundy, czyli rozdzielczością jednej milisekundy. Dla zdarzeń wymagających jedynie dnia można zastosować datetime2(0), a dla znaczników generowanych przez funkcje systemowe często wybiera się datetime2(7). Dobór precyzji powinien wynikać z rzeczywistego modelu danych, ponieważ większa precyzja wpływa na rozmiar przechowywanej wartości.

Wartości można wprowadzać za pomocą jednoznacznych literałów lub konwertować z innych typów przy użyciu CAST albo CONVERT. Przykład CAST('2026-08-24T14:35:12.1234567' AS datetime2(7)) tworzy wartość z siedmioma cyframi ułamka sekundy. Konwersja do typu o niższej precyzji powoduje zaokrąglenie części ułamkowej zgodnie z zasadami SQL Server, dlatego zmniejszanie parametru p może zmienić zapisaną wartość. DATETIME2 nie przechowuje strefy czasowej ani offsetu; do wartości zawierających przesunięcie względem UTC służy odrębny typ datetimeoffset.

Rozmiar zapisu i zachowanie w zapytaniach

Rozmiar przechowywanej wartości DATETIME2 zależy od wybranej 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. Część daty i część czasu są kodowane oddzielnie, dlatego sama zmiana parametru z datetime2(2) na datetime2(3) może zwiększyć rozmiar przechowywanej wartości o jeden bajt. W tabelach zawierających wiele rekordów oraz w indeksach taki wybór może mieć znaczenie dla zajętości miejsca i operacji wejścia-wyjścia.

DATETIME2 można porównywać operatorami <, >, =, <= i >=, sortować według niego oraz wykorzystywać go w warunkach zakresowych. Typ nadaje się do kolumn indeksowanych, na przykład przy wyszukiwaniu rekordów utworzonych w określonym przedziale czasu. Przy filtrowaniu zakresu lepiej porównywać kolumnę bezpośrednio z granicami tego samego typu niż owijać ją funkcją, ponieważ zastosowanie funkcji do kolumny może utrudnić optymalizatorowi użycie indeksu. Trzeba także pamiętać, że dwie wartości reprezentujące ten sam moment w różnych strefach czasowych nie są automatycznie rozpoznawane przez DATETIME2 jako równoważne, ponieważ typ nie zawiera informacji o strefie.

Dobór DATETIME2 w systemie opartym na SQL Server

DATETIME2 jest właściwym wyborem wtedy, gdy aplikacja korzystająca z SQL Server musi przechowywać daty wcześniejsze niż rok 1753, większą precyzję niż starszy DATETIME albo przewidywalny parametr dokładności. Warto jawnie określać datetime2(p) w definicji tabeli zamiast pozostawiać precyzję domyślną, gdy format danych jest elementem kontraktu między bazą a aplikacją. Dla danych biznesowych często wystarcza precyzja milisekundowa, natomiast znaczniki zdarzeń technicznych mogą wymagać większej liczby cyfr.

Podczas diagnostyki należy sprawdzić definicję kolumny, typ parametrów procedur i zapytań oraz sposób mapowania wartości po stronie aplikacji. Funkcja SYSDATETIME() zwraca wartość typu datetime2(7), lecz dokładność pomiaru zależy od zegara systemu operacyjnego. Jeżeli aplikacja ma zachować informację o przesunięciu czasowym, sama zmiana kolumny na DATETIME2 nie rozwiązuje problemu, ponieważ offset zostanie utracony lub będzie musiał być zapisany osobno. Diagnostyka naprawcza powinna więc obejmować zgodność typów, konwersje, granice zakresów dat oraz sposób interpretowania czasu przez kod korzystający z SQL Server.