Prawdopodobnie jest bardzo niewiele przypadków użycia, które mogłyby spowodować konwersję datetime2 wartość do data i godzina w SQL Server. W szczególności datetime2 typ danych można ustawić tak, aby używał tego samego rozmiaru pamięci co data i godzina , ale z większą precyzją. Więc w większości przypadków lepiej byłoby, gdybyś wybrał datetime2 niż z datetime . Microsoft zaleca również używanie datetime2 zamiast data i godzina .
Jeśli jednak znajdziesz się w sytuacji, w której musisz wykonać tę konwersję, ten artykuł zawiera kilka przykładów i wskazówek, które mogą być pomocne.
Po przekonwertowaniu data/godzina2 wartość do data i godzina , wynikowa wartość będzie zależeć od ułamków sekund, które zostały przypisane do datetime2 wartość, a także jej precyzję.
data/godzina2 typ danych umożliwia określenie dokładności ułamka sekundy od 0 do 7. Jeśli nie określisz tego, użyje 7 (wartość domyślna).
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.
Dlatego jeśli datetime2 używa skali 3, wynikowa wartość będzie bardzo zbliżona (jeśli nie identyczna) do wartości oryginalnej. Jednak ze względu na niższą dokładność data-godzina , wyniki mogą się różnić ze względu na zaokrąglanie, które wykonuje.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między datetime2 i data i godzina .
DECLARE @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Wynik:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 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 tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać datetime2 wartość do daty i godziny 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.
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 @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Wynik:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 | +-----------------------------+-------------------------+
W tym przykładzie ustawiłem ułamki sekund datetime2 wartość do 1256789
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).
Należy zauważyć, że nadal będzie to prawdą, nawet jeśli przypiszemy tylko 3 ułamki sekund do datetime2 wartość.
Przykład:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.125'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Wynik:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Warto również być świadomym wszelkich zaokrągleń, które mogą wystąpić w stosunku do oryginalnej datetime2 wartość. data/godzina2 sama wartość może zostać zaokrąglona w górę, jeśli spróbujemy przypisać wartość z większą liczbą ułamków sekund niż jej własna skala.
Przykład:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
Wynik:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
W tym przypadku próbuję przypisać wartość z ułamkową częścią 1256789 . Jednak ponieważ datetime2(3) wartość ma tylko skalę 3, może obsługiwać tylko 3 miejsca po przecinku, a w tym przypadku ostatnia cyfra jest zaokrąglana w górę (ponieważ następna cyfra to 5 lub więcej).
Zarówno datetime2(3) i data i godzina użyj tej samej ilości miejsca do przechowywania (8 bajtów). datetime2(3) typ danych faktycznie wykorzystuje 7 bajtów do przechowywania danych, ale dodatkowy 1 bajt do przechowywania precyzji.
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 data i godzina .
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS datetime) AS 'datetime';
Wynik:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 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 CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CONVERT(datetime, @thedatetime2) AS 'datetime';
Wynik:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+