Тази статия съдържа примери за преобразуване на datetime2 стойност до време стойност в SQL Server.
Едно от предимствата на преобразуването на datetime2 стойност до време е, че намалявате размера на съхранение от между 6 и 8 байта до между 3 и 5 байта (в зависимост от прецизността, която всеки тип данни му е присвоил). Строго погледнато, 1 допълнителен байт се използва за съхраняване на точността за тези типове данни, така че трябва да добавите 1 байт към тези количества.
Очевидно губите частта от датата по време на преобразуването, но няма да правите това преобразуване, ако трябва да запазите частта от датата.
Когато конвертирате datetime2 стойност до време , копира се само частта от време на стойността. Точният резултат ще зависи от точността на части от секундите, които са присвоени на всеки тип. Когато настъпиве прецизността е по-малка от datetime2 прецизност, дробните секунди се закръгляват нагоре, за да отговарят на времета прецизност.
По отношение на прецизността и двата типа данни ви позволяват да зададете скала от 0 знака след десетичната запетая до 7. Следователно имате възможността да извършите преобразуването, без да губите частични секунди или резултатът да се закръгля нагоре.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между datetime2 ивреме .
DECLARE @thedatetime2 datetime2, @thetime time;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', @thetime КАТО 'time;
Резултат:
+----------------------------+---------------- --+| дата и час2 | време ||----------------------------+---------------- -|| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |+----------------------------+------------ -----+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява имплицитно преобразуване зад кулисите, когато се опитваме да присвоим datetime2 стойност до време променлива.
Най-очевидното нещо в този резултат е, че времето стойността не включва датата. Това е очаквано, тъй като врема типът данни е единствено за съхранение на стойности за време, а не стойности за дата.
Също така, в този пример и двата типа данни използват своята точност по подразбиране (която е скала от 7). Това означава, че врест стойността завършва със същата точност като datetime2 стойност. Причината, поради която знам, че използват своята точност по подразбиране, е, че не посочих скала с част от секундата, когато ги декларирах.
Пример 2 – Преобразуване до по-висока точност
В този пример времето променливата използва по-висока точност до datetime2 променлива.
DECLARE @thedatetime2 datetime2(4), @thetime time(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', @thetime КАТО 'време';
Резултат:
+--------------------+------------------+ | дата и час2 | време ||-------------------------+------------------|| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |+---------------------------------+---------------- --+
В този случай datetime2 променливата използва скала от 4 и времето променливата използва 7.
Това води до datetime2 закръгляване на частичните секунди, така че получаваме 1235 вместо 1234 . Това също така означава, че когато го преобразуваме във време , стойността завършва с 3 крайни нули (защото сме посочили скала от 7). Това също така означава, че евремета Размерът за съхранение на стойността е 5 байта (6 включително прецизност) в сравнение с 4 байта (5 включително прецизност), ако му дадем мащаб от 4.
Пример 3 – Преобразуване до по-ниска точност
В този пример времето променливата използва по-ниска точност до datetime2 променлива.
DECLARE @thedatetime2 datetime2(7), @thetime time(0);SET @thedatetime2 ='2025-05-21 10:15:30.5678912';SET @thetime =@thedatetime2;ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', @thetime КАТО 'време';
Резултат:
+----------------------------+---------+| дата и час2 | време ||----------------------------+---------|| 21.05.2025 10:15:30.5678912 | 10:15:31 |+----------------------------+----------+предварително>Така че в този случайвреме Скалата на ‘s е намалена до 0, което означава, че в резултата не са включени частични секунди. Също така, секундите се закръгляват съответно.
Времетота стойността използва 4 байта за съхранение (включително прецизност), в сравнение с 9 байта за datetime2 стойност (и в сравнение с 6 байта завреме стойност в предишния пример).
Пример 4 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам
CAST()
функция директно вSELECT
изявление за изрично преобразуване между datetime2 ивреме .DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CAST(@thedatetime2 AS time(0)) КАТО 'time( 0)';Резултат:
+------------------------+-----------+| дата и час2 | време(0) ||-----------------------+----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+------------------------+----------+Пример 5 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на
CONVERT()
функция вместоCAST()
.DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CONVERT(time(0), @thedatetime2) КАТО 'time( 0)';Резултат:
+------------------------+-----------+| дата и час2 | време(0) ||-----------------------+----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+------------------------+----------+