Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość do data i godzina w SQL Server.
Kiedy konwertujesz przesunięcie daty i godziny wartość do data i godzina , wartości daty i godziny są kopiowane, a przesunięcie strefy czasowej jest obcinane. Gdy ułamkowa precyzja przesunięcia daty i godziny wartość jest większa niż trzy cyfry, wartość jest obcinana.
przesunięcie daty i godziny typ danych pozwala określić precyzję ułamków sekund od 0 do 7. Jest to realizowane za pomocą 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. Kolejny bajt jest używany do przechowywania precyzji, więc dodaje to 1 bajt do tych liczb.
data i godzina z drugiej strony typ danych ma maksymalnie 3 cyfry dla części ułamkowej sekundy. Jego dokładność jest zaokrąglana z dokładnością do 0,000, 0,003 lub 0,007 sekundy. Ten typ danych nie ma świadomości strefy czasowej, a zatem nie ma przesunięcia strefy czasowej. Jego rozmiar pamięci to 8 bajtów.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między przesunięciem daty i godziny i data i godzina .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
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ść na data i godzina zmienna.
Widzimy, że data i godzina zmienna ma mniejszą dokładność ułamków sekund i otrzymujemy ułamkową część 123 mimo że oryginalna część ułamkowa to 1234567 .
W tym przypadku nie wykonano zaokrąglania.
Widzimy również, że przesunięcie strefy czasowej zostało obcięte. data i godzina typ danych nie ma świadomości strefy czasowej.
W tej konwersji rozmiar pamięci zmniejszył się z 10 bajtów (11 bajtów, jeśli uwzględnisz dodatkowy bajt przechowujący precyzję) dla przesunięcie daty i godziny , do 8 bajtów dla data i godzina . Jeśli jednak przesunięcie daty i godziny value użyłaby skali od 0 do 2, użyłaby tylko 8 bajtów (9 łącznie z precyzją).
Gdyby użył skali 3 (odpowiednik datetime wartość), rozmiar pamięci wynosiłby 9 bajtów (10 z dokładnością). Jednak jego dokładność byłaby wyższa niż data-godzina . Oczywiście dokładność zostanie zmniejszona, gdy tylko przekonwertujemy ją na data i godzina .
Przykład 2 – Precyzja/Dokładność i zaokrąglanie
data i godzina typ danych jest zaokrąglany do przyrostów o 0,000, 0,003 lub 0,007 sekundy. Nawet jeśli jawnie ustawisz ją na inną wartość, zostanie ona zaokrąglona.
Dotyczy to również konwersji z innego typu danych (takiego jak to, co tutaj robimy).
Oto przykład, który pokazuje, o co mi chodzi.
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00'; SET @thedatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 | +------------------------------------+-------------------------+
W tym przykładzie ustawiłem ułamki sekund przesunięcie daty i godziny wartość do 1250000
ale data i godzina zaokrąglono w górę do
127
(ponieważ można go zaokrąglać tylko do przyrostów o 0,000, 0,003 lub 0,007 sekundy).
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 i godzina .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) AS 'datetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
Przykład 4 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu metody CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset) AS 'datetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+