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

SYSTEM_TIME

Termin Definicja
SYSTEM_TIME

SYSTEM_TIME to klauzula wykorzystywana przy odpytywaniu tabel temporalnych o dane z określonego okresu.

Rola SYSTEM_TIME w tabelach temporalnych SQL Server

SYSTEM_TIME jest elementem składni zapytań do systemowych tabel temporalnych w Microsoft SQL Server. Pozwala wskazać, z jakiego przedziału czasu mają zostać odczytane wersje wierszy przechowywane przez mechanizm temporalny. Tabela temporalna składa się z tabeli bieżącej oraz powiązanej z nią tabeli historii. SQL Server zapisuje w tabeli historii wcześniejsze wersje rekordów, gdy wiersz zostanie zmieniony albo usunięty, a kolumny okresu systemowego określają przedział obowiązywania danej wersji.

Klauzula jest używana po nazwie tabeli, zwykle wraz z aliasem, w postaci FOR SYSTEM_TIME oraz jednego z predykatów czasu. Nie jest to samodzielna funkcja ani nazwa typu danych. Jej zadaniem jest określenie punktu lub zakresu czasu, dla którego optymalizator ma uwzględnić odpowiednie wersje rekordów. Bez tej klauzuli zapytanie odczytuje standardowo aktualny stan tabeli, a nie pełną historię zmian.

Predykaty czasu dostępne po FOR SYSTEM_TIME

SQL Server udostępnia kilka wariantów zapytania temporalnego. AS OF zwraca stan tabeli obowiązujący w określonym momencie. Przykładowo zapytanie SELECT * FROM dbo.Urzadzenia FOR SYSTEM_TIME AS OF '2025-01-15T12:00:00' odczytuje wersję danych obowiązującą o wskazanej godzinie. Wartość czasu jest interpretowana względem czasu systemowego SQL Server, a niekoniecznie względem zegara komputera, z którego wysłano zapytanie.

Predykat FROM ... TO zwraca wersje, których okres obowiązywania przecina wskazany przedział, przy czym granica początkowa jest włączona, a końcowa wyłączona. BETWEEN ... AND działa podobnie, ale uwzględnia również wersje obowiązujące dokładnie w punkcie końcowym. CONTAINED IN (...) ogranicza wynik do wersji w całości zawartych w podanym przedziale. Dostępny jest także wariant ALL, który zwraca aktualne i historyczne wersje bez ograniczania ich do konkretnego momentu lub zakresu.

Jak SQL Server wyznacza wersję rekordu

Systemowe tabele temporalne wykorzystują dwie kolumny okresu, najczęściej definiowane jako datetime2. Jedna przechowuje początek obowiązywania wersji, a druga jego koniec. Kolumny te są oznaczane w definicji tabeli jako GENERATED ALWAYS AS ROW START i GENERATED ALWAYS AS ROW END, a tabela otrzymuje definicję okresu przez PERIOD FOR SYSTEM_TIME. Użytkownik nie ustala tych wartości dowolnie przy zwykłej modyfikacji rekordu; SQL Server zarządza nimi w ramach wersjonowania systemowego.

Przy aktualizacji bieżącej wersji SQL Server zapisuje poprzedni stan w tabeli historii i tworzy nową wersję w tabeli głównej. Przy usunięciu rekord również trafia do historii, aby możliwe było odtworzenie jego wcześniejszego stanu w zapytaniu temporalnym. Wynik zapytania z FOR SYSTEM_TIME jest logicznym połączeniem danych aktualnych i historycznych, dlatego aplikacja nie musi samodzielnie znać nazwy tabeli historii. Jeżeli tabela nie jest skonfigurowana jako temporalna albo wskazana składnia nie odpowiada jej definicji, SQL Server zwróci błąd zamiast potraktować SYSTEM_TIME jako zwykły tekst.

Kontrola zapytań temporalnych w środowisku SQL Server

Podczas diagnostyki należy najpierw potwierdzić, że zapytanie dotyczy tabeli temporalnej SQL Server, a następnie sprawdzić użyty predykat i typ wartości czasu. Szczególne znaczenie ma strefa czasowa aplikacji, ponieważ kolumny okresu systemowego opisują czas rejestrowany przez instancję SQL Server. Różnica między czasem lokalnym a czasem serwera może prowadzić do pozornie brakujących rekordów, zwłaszcza gdy aplikacja przesyła granice przedziału jako tekst bez jednoznacznego oznaczenia czasu.

W praktyce warto porównywać zapytanie bieżące z zapytaniem temporalnym, sprawdzać zakresy przez jawne wartości datetime2 i kontrolować, czy granice przedziału są zgodne z semantyką wybranego predykatu. FROM ... TO, BETWEEN ... AND oraz CONTAINED IN nie są zamienne, ponieważ inaczej traktują wersje stykające się z końcem zakresu. Przy analizie historii zmian trzeba też pamiętać, że systemowe wersjonowanie pokazuje okresy zarejestrowane przez SQL Server; nie jest dziennikiem każdej próby wykonania polecenia ani zapisem wszystkich wartości parametrów użytych przez aplikację.