Вероятно има много малко случаи на използване, които биха ви накарали да конвертирате datetime2 стойност до дата и час в SQL Server. По-специално, datetime2 типът данни може да бъде настроен да използва същия размер за съхранение като datetime , но с по-висока точност. Така че в повечето случаи е по-добре с datetime2 отколкото с дата и час . Microsoft също препоръчва използването на datetime2 вместо datetime .
Въпреки това, в случай че се окажете в ситуация, в която трябва да извършите това преобразуване, тази статия съдържа някои примери и съображения, които може да ви бъдат полезни.
Когато конвертирате datetime2 стойност до дата и час , получената стойност ще зависи от частите от секундите, които са били присвоени на datetime2 стойност, както и неговата прецизност.
datetime2 типът данни ви позволява да зададете точност на частични секунди от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране).
Дата и час тип данни от друга страна, има максимум 3 цифри за частта от секундите. Неговата точност се закръглява до стъпки от .000, .003 или .007 секунди.
Следователно, ако datetime2 използва скала от 3, получената стойност ще бъде много близка (ако не е идентична) до оригиналната стойност. Въпреки това, поради по-ниската точност на datetime , резултатите могат да бъдат различни, поради закръгляването, което извършва.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между datetime2 и дата и час .
DECLARE @thedatetime2 datetime2, @thedatetime datetime;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thedatetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetimete2', AS';
Резултат:
+----------------------------+---------------- ---------+| дата и час2 | дата и час ||----------------------------+---------------- --------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |+----------------------------+-------- -----------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetime2 стойност към дата и час променлива.
Виждаме, че datetime променливата има по-малка прецизност на дробни секунди и в крайна сметка получаваме дробна част от 123 въпреки че оригиналната дробна част беше 1234567 .
В този случай не е извършено закръгляване.
Пример 2 – Прецизност/точност и закръгляване
Дата и час типът данни се закръглява до стъпки от .000, .003 или .007 секунди. Дори ако изрично го зададете на друга стойност, тя ще бъде закръглена.
Това важи и при конвертиране от друг тип данни (като това, което правим тук).
Ето пример, който демонстрира какво имам предвид.
DECLARE @thedatetime2 datetime2, @thedatetime datetime;SET @thedatetime2 ='2025-05-21 10:15:30.1256789';SET @thedatetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetimete2', AS';
Резултат:
+----------------------------+---------------- ---------+| дата и час2 | дата и час ||----------------------------+---------------- --------|| 21.05.2025 10:15:30.1256789 | 2025-05-21 10:15:30.127 |+----------------------------+-------- -----------------+
В този пример зададох частичните секунди на datetime2 стойност до 1256789
но дата и час закръгли го до
127
(тъй като може да се закръгля само до стъпки от .000, .003 или .007 секунди).
Важно е да се отбележи, че това пак ще е вярно, дори ако присвоим само 3 части от секунди на datetime2 стойност.
Пример:
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';
Резултат:
+-------------------+-------------------- -----+| дата и час2 | дата и час ||------------------------+--------------------- ----|| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |+-------------------------+------------ ------------+
Също така си струва да сте наясно с всяко закръгляване, което може да възникне до оригиналната datetime2 стойност. datetime2 Стойността сама по себе си може да се закръгли нагоре, ако се опитаме да присвоим стойност с повече части от секундите от нейната собствена скала.
Пример:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime;SET @thedatetime2 ='2025-05-21 10:15:30.1256789';SET @thedatetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО @thedatetime2 КАТО 'datetime2' 'datetime';
Резултат:
+-------------------+-------------------- -----+| дата и час2 | дата и час ||------------------------+--------------------- ----|| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |+-------------------------+------------ ------------+
В този случай се опитвам да присвоя стойност с дробна част от 1256789 . Въпреки това, тъй като datetime2(3) стойността има само скала от 3, тя може да поддържа само 3 знака след десетичната запетая и в този случай последната цифра се закръглява нагоре (тъй като следващата цифра е 5 или по-висока).
И двете datetime2(3) и дата и час използвайте същото количество място за съхранение (8 байта). datetime2(3) типът данни всъщност използва 7 байта за съхранение на данните, но допълнителен 1 байт за съхраняване на точността.
Пример 3 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetime2 и дата и час .
DECLARE @thedatetime2 datetime2;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CAST(@thedatetime2 AS datetime) КАТО 'datetime';>
Резултат:
+----------------------------+---------------- ---------+| дата и час2 | дата и час ||----------------------------+---------------- --------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |+----------------------------+-------- -----------------+
Пример 4 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedatetime2 datetime2;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CONVERT(datetime, @thedatetime2) КАТО 'datetime';Резултат:
+----------------------------+---------------- ---------+| дата и час2 | дата и час ||----------------------------+---------------- --------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |+----------------------------+-------- -----------------+