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

DATETIMEOFFSET

Termin Definicja
DATETIMEOFFSET

DATETIMEOFFSET to typ danych SQL Server przechowujący datę i czas wraz z informacją o przesunięciu strefy czasowej.

Budowa wartości DATETIMEOFFSET w SQL Server

DATETIMEOFFSET jest typem danych programu SQL Server przeznaczonym do przechowywania daty i czasu razem z przesunięciem względem czasu UTC. Wartość składa się z części kalendarzowej, części zegarowej oraz offsetu zapisanego w formacie od -14:00 do +14:00. Przykład 2026-08-25 14:30:00.1234567 +02:00 oznacza godzinę 14:30 i 1234567 części ułamkowych sekundy przy przesunięciu wynoszącym dwie godziny względem UTC. Offset nie jest nazwą strefy czasowej, lecz konkretną informacją o różnicy względem UTC.

Typ DATETIMEOFFSET można zadeklarować z precyzją ułamkowej części sekundy od 0 do 7, na przykład jako datetimeoffset(3) albo datetimeoffset(7). Najwyższa precyzja odpowiada dokładności 100 nanosekund. Zakres dat obejmuje okres od 1 stycznia 0001 roku do 31 grudnia 9999 roku, a zakres czasu obejmuje wartości od północy do końca doby. Rozmiar przechowywanej wartości zależy od precyzji: 8 bajtów dla precyzji od 0 do 2, 9 bajtów dla precyzji 3 lub 4 oraz 10 bajtów dla precyzji od 5 do 7.

Offset UTC a rzeczywista strefa czasowa

Przesunięcie zapisane w DATETIMEOFFSET nie zawiera reguł zmiany czasu ani identyfikatora strefy, takiego jak nazwa strefy używana w systemie operacyjnym. Wartość 2026-01-15 12:00:00 +01:00 przechowuje offset +01:00, ale sama nie informuje, czy pochodzi z konkretnego miasta, regionu albo ustawienia aplikacji. Z tego powodu DATETIMEOFFSET zachowuje lokalny czas i jego relację do UTC, lecz nie przechowuje pełnej historii zmian obowiązujących w danej lokalizacji.

Ma to znaczenie przy danych rejestrowanych w różnych miejscach geograficznych. Dwie wartości mogą przedstawiać ten sam moment na osi UTC, mimo że mają inne godziny lokalne i inne offsety. Na przykład 2026-08-25 14:00:00 +02:00 oraz 2026-08-25 12:00:00 +00:00 wskazują ten sam moment. Jeżeli aplikacja musi przeliczać czas według reguł czasu letniego i zimowego, w SQL Server można użyć mechanizmu AT TIME ZONE, który korzysta z nazw stref czasowych dostępnych w systemie Windows. Sam DATETIMEOFFSET pozostaje jednak wartością z zapisanym offsetem, a nie odwołaniem do dynamicznej reguły strefy.

Konwersje, funkcje i porównywanie wartości

Funkcja SYSDATETIMEOFFSET() zwraca bieżącą datę i czas serwera wraz z lokalnym przesunięciem UTC, używając typu DATETIMEOFFSET. Dołączenie offsetu do wartości typu datetime2 można wykonać za pomocą TODATETIMEOFFSET. Ta operacja interpretuje istniejące wskazanie daty i zegara jako czas z podanym offsetem; nie służy do przeliczania tej samej chwili na inną godzinę lokalną. Do zmiany prezentowanego offsetu przy zachowaniu tego samego momentu UTC służy SWITCHOFFSET.

Przy konwersjach trzeba rozróżnić zmianę reprezentacji od zmiany znaczenia wartości. Rzutowanie DATETIMEOFFSET na datetime2 usuwa informację o przesunięciu i pozostawia część daty oraz czasu lokalnego. Rzutowanie na datetime dodatkowo ogranicza zakres i precyzję zgodnie z właściwościami starszego typu. Z kolei konwersja do date zachowuje wyłącznie datę, a do time wyłącznie czas. Podczas porównywania wartości DATETIMEOFFSET SQL Server uwzględnia ich odpowiedniki w UTC, dlatego wartości o różnych offsetach mogą zostać uznane za równe, jeśli opisują ten sam moment.

Znaczenie typu przy zapisie i kontroli danych

DATETIMEOFFSET jest przydatny wtedy, gdy rekord powinien zachować zarówno lokalne wskazanie czasu, jak i przesunięcie obowiązujące w chwili zapisu. Dotyczy to między innymi znaczników zdarzeń, historii operacji aplikacji, danych przesyłanych między lokalizacjami oraz informacji, których późniejsza interpretacja wymaga odtworzenia pierwotnej reprezentacji czasowej. Wybór precyzji powinien odpowiadać rzeczywistym wymaganiom: datetimeoffset(0) nie zapisuje części ułamkowej sekundy, natomiast datetimeoffset(7) przechowuje ją z maksymalną dokładnością tego typu.

Podczas diagnostyki problemów z datą i czasem należy sprawdzić definicję kolumny, precyzję, wartość offsetu oraz sposób konwersji wykonywany przez zapytanie lub aplikację. Częstym źródłem rozbieżności jest zapisanie DATETIMEOFFSET do kolumny datetime2, ponieważ operacja ta usuwa przesunięcie, albo użycie TODATETIMEOFFSET tam, gdzie potrzebne było przeliczenie chwili na inną strefę. Warto również zweryfikować ustawienia serwera i aplikacji, format parametrów oraz wynik funkcji SYSDATETIMEOFFSET(). Taka kontrola pozwala odróżnić błąd danych od prawidłowej różnicy między czasem lokalnym a UTC.