Ten artykuł zawiera przykłady konwersji data/godzina2 wartość na przesunięcie daty i godziny wartość w SQL Server.
Po przekonwertowaniu data/godzina2 wartość przesunięcie daty i godziny , wynikowa wartość będzie zależeć od dokładności ułamków sekund, która jest przypisana do każdego typu danych, a także od dowolnego określonego przesunięcia strefy czasowej.
Oba typy danych umożliwiają określenie dokładności ułamków sekund od 0 do 7. Jeśli tego nie określisz, używana jest domyślna skala 7.
przesunięcie daty i godziny typ danych zawiera przesunięcie strefy czasowej i może zachować wszelkie przesunięcia w oryginalnej wartości. Jednak datetime2 nie ma świadomości strefy czasowej, więc nie ma żadnych wartości do zachowania. W takim przypadku przesunięcie strefy czasowej jest domyślnie ustawione na +00:00.
TODATETIMEOFFSET()
funkcja została specjalnie zaprojektowana do konwersji wartości daty/czasu na przesunięcie daty/czasu i dodaj przesunięcie strefy czasowej. Jednak zobacz moje komentarze (i przykłady) poniżej dotyczące tej opcji.
Przykład 1 – Konwersja niejawna
Po pierwsze, oto przykład niejawnej konwersji między datetime2 i przesunięcie daty i godziny .
DECLARE @thedatetime2 datetime2(7), @thedatetimeoffset datetimeoffset(7); SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetimeoffset = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetimeoffset AS 'datetimeoffset(7)';
Wynik:
+-----------------------------+------------------------------------+ | datetime2 | datetimeoffset(7) | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 | +-----------------------------+------------------------------------+
Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać datetime2 wartość na przesunięcie daty i godziny zmienna.
Widzimy, że przesunięcie daty i godziny zmienna może używać tej samej precyzji co datetime2 wartość (7 miejsc po przecinku). Kończymy również z przesunięciem strefy czasowej o +00:00 .
Użycie dokładności 7 ułamków sekund powoduje przesunięcie daty i godziny użyć 11 bajtów do przechowywania (10 na dane i 1 bajt na precyzję). data/godzina2 type używa 9 bajtów (8 dla danych i 1 bajt dla precyzji) przy użyciu skali 7.
Możesz jednak zmniejszyć precyzję, zastępując 7 niższą liczbą.
Przykład 2 – Zaokrąglanie
Jeśli przesunięcie daty i godziny ma mniejszą precyzję niż datetime2 wartość, zostanie zaokrąglona w górę.
Oto przykład:
DECLARE @thedatetime2 datetime2(7), @thedatetimeoffset datetimeoffset(6); SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetimeoffset = @thedatetime2; SELECT @thedatetime2 AS 'datetime2(7)', @thedatetimeoffset AS 'datetimeoffset(6)';
Wynik:
+-----------------------------+------------------------------------+ | datetime2(7) | datetimeoffset(6) | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 | +-----------------------------+------------------------------------+
W tym przykładzie datetime2 wartość ma skalę 7, ale przesunięcie daty i godziny skala wartości wynosi tylko 6. Dlatego jej precyzja wynosi tylko do 6 miejsc po przecinku, a szósta cyfra jest zaokrąglana do 7 (zamiast 6).
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 o jawnej konwersji między datetime2 i przesunięcie daty i godziny .
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';
Wynik:
+-----------------------------+------------------------------------+ | datetime2 | datetimeoffset | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 | +-----------------------------+------------------------------------+
Przykład 4 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';
Wynik:
+-----------------------------+------------------------------------+ | datetime2 | datetimeoffset | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 | +-----------------------------+------------------------------------+
Przykład 5 – Zmiana przesunięcia strefy czasowej
Jeśli konwertujesz z datetime2 na przesunięcie daty i godziny , prawdopodobnie robisz to dla przesunięcia strefy czasowej. Jest również bardzo prawdopodobne, że będziesz potrzebować wartości innej niż domyślna +00:00.
Na szczęście możesz użyć TODATETIMEOFFSET()
funkcja zmiany przesunięcia.
Możesz także użyć tej funkcji, aby przekonwertować oryginalną datetime2 wartość na przesunięcie daty i godziny wartość. Ta funkcja akceptuje dowolną wartość daty/godziny, która może zostać przekształcona w datetime2 wartość i wartość przesunięcia.
Oto przykład:
DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00'); SELECT @thedatetime2 AS 'datetime2', @thedatetimeoffset AS 'datetimeoffset';
Wynik:
+-----------------------------+------------------------------------+ | datetime2 | datetimeoffset | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 | +-----------------------------+------------------------------------+
A oto przykład użycia funkcji w SELECT
oświadczenie:
DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';
Wynik:
+-----------------------------+------------------------------------+ | datetime2 | datetimeoffset | |-----------------------------+------------------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 | +-----------------------------+------------------------------------+
Jedna ważna kwestia dotycząca TODATETIMEOFFSET()
funkcja polega na tym, że używa tej samej dokładności ułamkowej, co przekazany do niej argument daty/godziny.
Dlatego jeśli Twój datetime2 używa mniejszej precyzji niż przesunięcie daty i godziny , zawsze możesz ponownie przypisać ją do zmiennej z większą precyzją, a następnie przekazać tę przekonwertowaną wartość do TODATETIMEOFFSET()
.
Przykład:
DECLARE @lowprecision datetime2(3), @highprecision datetime2(7); SET @lowprecision = '2025-05-21 10:15:30.123'; SET @highprecision = @lowprecision; SELECT @lowprecision AS 'lowprecision', @highprecision AS 'highprecision', TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';
Wynik (przy użyciu wyjścia pionowego):
lowprecision | 2025-05-21 10:15:30.123 highprecision | 2025-05-21 10:15:30.1230000 Modified | 2025-05-21 10:15:30.1230000 +07:00