Тази статия съдържа примери за преобразуване на дата и час стойност до datetime2 стойност в SQL Server.
Когато конвертирате дата и час стойност на datetime2 , резултантната стойност ще зависи от точността на частни секунди, която присвоите на datetime2 .
Дата и час Типът данни има максимум 3 цифри за частта от секундите. Неговата точност се закръглява до стъпки от .000, .003 или .007 секунди.
datetime2 типът данни, от друга страна, ви позволява да зададете точност на частични секунди от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране).
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между дата и час и дата и час2 .
DECLARE @thedatetime datetime, @thedatetime2 datetime2; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Резултат:
+-------------------------+-----------------------------+ | datetime | datetime2 | |-------------------------+-----------------------------| | 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 | +-------------------------+-----------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява неявно преобразуване зад кулисите, когато се опитваме да присвоим datetime стойност до datetime2 променлива.
Виждаме, че datetime2 променливата има по-голяма точност на дробни секунди и в крайна сметка получаваме дробна част от 1233333 (срещу 123 за дата и час стойност).
Пример 2 – Закръгляване
Дата и час типът данни се закръглява до стъпки от .000, .003 или .007 секунди. Дори ако изрично го зададете на друга стойност, тя ще бъде закръглена. Както може да очаквате, това може да предизвика много объркване, ако не сте наясно как работи. Това не само може да предизвика объркване при използване на datetime само по себе си може да причини допълнително объркване при преобразуване на тази стойност в друг тип данни.
Ето пример, който демонстрира какво имам предвид.
DECLARE @thedatetime datetime, @thedatetime2 datetime2; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Резултат:
+-------------------------+-----------------------------+ | datetime | datetime2 | |-------------------------+-----------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 | +-------------------------+-----------------------------+
В този пример зададох частичните секунди на 125
но дата и час закръгли го до
127
(тъй като може да се закръгля само до стъпки от .000, .003 или .007 секунди).
datetime2 стойност обаче, задайте частичните секунди на 1266667 .
Между другото, ако просто зададем първоначалната стойност на datetime2 на първо място, неговата дробна част би върнала 1250000 .
Пример 3 – Прецизност/точност
Едно от предимствата на datetime2 е, че ви позволява да зададете точността на частични секунди. Ако не направите това, той използва 7 (следователно предишният пример използва 7).
Следователно можем да модифицираме предишния пример, така че datetime2 стойността използва същата точност в частни секунди като datetime тип данни.
DECLARE @thedatetime datetime, @thedatetime2 datetime2(3); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Резултат:
+-------------------------+-------------------------+ | datetime | datetime2 | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Когато направим това, datetime2 value връща същия резултат като datetime стойност. Той също така използва същото количество памет (8 байта). В този случай datetime2 използва 7 байта за съхраняване на стойността и 1 байт за съхраняване на точността на стойността.
Можете дори да посочите по-малко прецизност до части от секунди от дата и час ако нямате нужда от допълнителна прецизност. Това ще ви спести цял байт място за съхранение (вашата datetime2 стойност ще използва 7 байта, в сравнение с 8 байта за datetime стойност).
DECLARE @thedatetime datetime, @thedatetime2 datetime2(2); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Резултат:
+-------------------------+------------------------+ | datetime | datetime2 | |-------------------------+------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 | +-------------------------+------------------------+
Имайте предвид, че това може също да доведе до закръгляване на част от секундите.
Пример 4 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между datetime и дата и час2 .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetime2(3)) AS 'datetime2(3)';
Резултат:
+-------------------------+-------------------------+ | datetime | datetime2(3) | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Пример 5 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(datetime2(3), thedatetime) AS 'datetime2(3)';
Резултат:
+-------------------------+-------------------------+ | datetime | datetime2(3) | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Препоръка на Microsoft
Microsoft препоръчва използването на изрично прехвърляне винаги, когато съществува смесен сценарий за сравнение между тези два типа данни:
При ниво на съвместимост на базата данни 130, неявни преобразувания от datetime до дата и час2 типовете данни показват подобрена точност чрез отчитане на частните милисекунди, което води до различни преобразувани стойности... Използвайте изрично прехвърляне към datetime2 тип данни всеки път, когато има смесен сценарий за сравнение между дата и час и дата и час2 съществуват типове данни.