Тази статия съдържа примери за преобразуване на време стойност до datetime2 стойност в SQL Server.
Когато преобразувате време стойност на datetime2 , към стойността се добавя допълнителна информация. Това е така, защото datetime2 типът данни съдържа както информация за дата, така и за час. Времетота типът данни, от друга страна, съдържа само информация за времето.
По-конкретно, датата е настроена на '1900-01-01' (освен ако не се закръгли до '1900-01-02'), компонентът за време се копира и според документацията на Microsoft, изместването на часовата зона е настроен на 00:00 (въпреки че datetime2 типът данни не е наясно с часовата зона и не запазва изместване на часовата зона).
Когато точността на частни секунди на datetime2(n) стойността е по-голяма от времето(n) стойност, стойността се закръглява нагоре.
Пример 1 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване от време до дата и час2 .
ДЕКЛАРИРРезултат:
+------------------+------------------------------------ --+| време | datetime2 ||-----------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+Когато конвертирате от време до дата и час2 , компонент за дата се добавя и се задава на
1900-01-01
.Въпреки това, има сценарии, при които датата може да бъде закръглена до
1900-01-02
. Това ще зависи от частите от секундите и каква прецизност използвате. Вижте по-долу за пример за това.Пример 2 – Прецизност на дробни секунди
Можете да получите различни резултати в зависимост от точността на частични секунди, която е присвоена на всеки тип данни. Това ще зависи от действителната стойност на дробната част.
В предишния пример и двата типа данни използваха една и съща точност на частични секунди. Това е така, защото не посочих мащаб (за да дефинирам тяхната прецизност) и следователно и двамата са използвали стойностите си по подразбиране (и двете са 7).
Само за да е ясно, мащаб е броят на цифрите вдясно от десетичната запетая в число. Прецизност е общият брой цифри в числото.
Както и да е, в този пример зададох само 6 знака след десетичната запетая на първоначалната стойност, следователно в края се добавя нула.
Ето какво се случва, ако посоча по-висока точност за времето стойност в сравнение с datetime2 стойност:
DECLARE @thetime time(7);SET @thetime ='23:15:59.1234567';ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime2(4)) КАТО 'datetime2(4)';предварително>Резултат:
+------------------+-----------------------------------+ | време | дата и час2(4) ||-----------------+----------------------- -|| 23:15:59.1234567 | 1900-01-01 23:15:59.1235 |+------------------+------------------- -------+Като посочите мащаб от 4 до datetime2 стойност, резултатът се намалява до 4 знака след десетичната запетая и в този случай се закръглява нагоре.
Както може да очаквате, не само дробната част може да бъде закръглена. Ето пример за това къде дробната част кара минутите и секундите да се закръглят нагоре:
DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime2(0)) КАТО 'datetime2(0)';предварително>Резултат:
+------------------+---------------------+| време | datetime2(0) ||-----------------+---------------------|| 23:15:59.7654321 | 1900-01-01 23:16:00 |+------------------+------------------- --+Можете обаче да получите различни резултати за едни и същи данни, като промените точността. Ако увеличим точността, дори само с един знак след десетичната запетая, получаваме това:
DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime2(1)) КАТО 'datetime2(1)';предварително>Резултат:
+------------------+-----------------------+| време | datetime2(1) ||-----------------+--------------------------------|| 23:15:59.7654321 | 1900-01-01 23:15:59.8 |+------------------+------------------- ----+Така че в този случай минутите и секундите не бяха закръглено нагоре (но милисекунди бяха ).
Ето какво се случва, ако задам часа стойност, за да използвате скала с по-ниска точност от datetime2 стойност.
DECLARE @thetime time(0);SET @thetime ='23:15:59.004007';ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime2) КАТО 'datetime2';Резултат:
+---------+------------------------+| време | datetime2 ||---------+----------------------------|| 23:15:59 | 1900-01-01 23:15:59.0000000 |+----------+--------------------------- --+И докато сме на това, ето пример за това къде нашата прецизна скала може да доведе до частични секунди, причиняващи датата да бъде закръглена до следващия ден:
DECLARE @thetime time(7);SET @thetime ='23:59:59.9999999';ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime2(0)) КАТО 'datetime2(0)';предварително>Резултат:
+------------------+---------------------+| време | datetime2(0) ||-----------------+---------------------|| 23:59:59,9999999 | 1900-01-02 00:00:00 |+-----------------+------------------- --+Пример 3 – Изрично преобразуване с помощта на CONVERT()
Това е същото като първия пример, освен че този път използвам
CONVERT()
функция вместоCAST()
.DECLARE @thetime time;SET @thetime ='23:15:59.004007';ИЗБЕРЕТЕ @thetime КАТО 'time', CONVERT(datetime2, @thetime) КАТО 'datetime2';Резултат:
+------------------+------------------------------------ --+| време | datetime2 ||-----------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+Пример 4 – Неявно преобразуване
Ето пример за правене на същото нещо, но с помощта на имплицитно преобразуване на тип.
DECLARE @thetime time, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;ИЗБЕРЕТЕ @thetime КАТО 'time', @thedatetime2 AS 'datetime2';Резултат:
+------------------+------------------------------------ --+| време | datetime2 ||-----------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+------------------+------------------- ----------+Така че получаваме един и същ резултат, независимо дали е изрично или неявно преобразуване.
Това е имплицитно преобразуване, защото не използваме функция за преобразуване, за да я преобразуваме изрично. Ние просто присвояваме стойността от променлива от един тип данни на променлива от друг тип данни. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да зададем време стойност до datetime2 променлива.
Пример 5 – Промяна на датата
Ако трябва да промените датата (но запазите същото време), можете да използвате
DATEADD()
функция.DECLARE @thetime time, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;SET @thedatetime2 =DATEADD(година, 120, @thedatetime2);ИЗБЕРЕТЕ @thetime КАТО ' време', @thedatetime2 AS 'datetime2';Резултат:
+------------------+------------------------------------ --+| време | datetime2 ||-----------------+---------------------------- -|| 23:15:59.0040070 | 2020-01-01 23:15:59.0040070 |+------------------+------------------- ----------+В този случай добавям 120 към стойността на годината, което я довежда до 2020 г.