Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość datetime2 w SQL Server.
Kiedy konwertujesz przesunięcie daty i godziny wartość datetime2 , data i godzina są kopiowane do datetime2 wartość, a strefa czasowa zostanie obcięta. Ułamki sekund są również obcinane, aby zmieściły się, jeśli dokładność miejsca docelowego jest niższa.
przesunięcie daty i godziny typ danych umożliwia określenie dokładności ułamków sekund od 0 do 7 przy użyciu datetimeoffset(n)
składnia. Jeśli tego nie określisz, użyje 7 (domyślnie). Ma również przesunięcie strefy czasowej. Rozmiar pamięci tego typu danych wynosi 8, 9 lub 10 bajtów, w zależności od używanej precyzji.
data/godzina2 typ danych pozwala również na określenie dokładności ułamków sekund od 0 do 7 (za pomocą datetime2(n)
składnia). Nie ma świadomości strefy czasowej. Jego rozmiar pamięci wynosi 6, 7 lub 8, w zależności od używanej precyzji.
Zwróć uwagę, że wymienione tutaj ilości magazynu są kwotami wymienionymi w dokumentacji firmy Microsoft. Jednak te typy danych również używają 1 bajtu do przechowywania precyzji. Dlatego dodaj 1 bajt do podanych tutaj ilości, aby uzyskać pełniejszy obraz wymagań dotyczących przechowywania.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między przesunięciem daty i godziny i data/godzina2 .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
Wynik:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+
Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W takim przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać przesunięcie daty i godziny wartość do datetime2 zmienna.
W tym przykładzie oba typy danych używają domyślnej dokładności (7 miejsc po przecinku). Dlatego część ułamkowa to 1234567 dla obu wyników.
Widzimy również, że przesunięcie strefy czasowej zostało obcięte — datetime2 typ danych nie ma świadomości strefy czasowej.
W tej konwersji rozmiar pamięci zmniejszył się z 10 bajtów (dla datetimeoffset ) do 8 bajtów (dla datetime2 ), chociaż należy pamiętać, że 1 bajt jest dodawany w celu przechowywania precyzji.
Przykład 2 – Inna precyzja
Oto przykład, który pokazuje, co się stanie, jeśli datetime2 wartość używa mniejszej precyzji do przesunięcia daty i godziny wartość.
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
W tym przykładzie przesunięcie daty i godziny ma skalę 7
ale datetime2 wartość ma skalę tylko 3
. Dlatego ułamki sekund zostały obcięte, aby zmieścić.
Pamiętaj, że może to spowodować zaokrąglenie. Oto przykład, w którym ułamkowa część datetime2 wartość jest zaokrąglana w górę do 124 .
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 | +------------------------------------+-------------------------+
Przykład 3 – Jawna konwersja za pomocą CAST()
Oto przykład jawnej konwersji. W tym przypadku używam CAST()
działać bezpośrednio w SELECT
oświadczenie, aby jawnie przekonwertować między przesunięciem daty i godziny i data/godzina2 .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime2) AS 'datetime2';
Wynik:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+
Przykład 4 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2';
Wynik:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+