Тази статия съдържа примери за преобразуване на време стойност към дата и час стойност в SQL Server.
Когато преобразувате време стойност до дата и час , към стойността се добавя допълнителна информация. Това е така, защото datetime типът данни съдържа както информация за дата, така и за час. Времетота типът данни, от друга страна, съдържа само информация за времето. Следователно информацията за дата се добавя към стойността, когато извършвате такова преобразуване. По-конкретно, датата е зададена на „1900-01-01“.
Пример 1 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване от време до дата и час .
ДЕКЛАРИРАНЕ @thetime timeSET @thetime ='23:15:59.004007'ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime) КАТО 'datetime';
Резултат:
+------------------+-----------------------+| време | дата и час ||------------------+----------------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------ ------+
Когато конвертирате от време до дата и час , компонентът за дата е настроен на 1900-01-01
.
Също така имайте предвид, че самата стойност на времето се представя по различен начин и в двата типа данни. Времетота типът данни добавя нула към края (защото има по-висока прецизност – скалата му по подразбиране е 7). От друга страна, datetime стойностите използват по-ниска скала и се закръгляват до стъпки от .000, .003 или .007 секунди. Ако смятате, че това е проблематично, помислете за конвертиране в datetime2 вместо.
Пример 2 – По-ниска точност/мащаб
В предишния пример, времето стойността имаше по-висока прецизност в частни секунди от datetime стойност. Това е така, защото използва скала по подразбиране от 7. Но можем да променим това на по-ниска стойност, ако е необходимо.
Само за да е ясно, мащаб е броят на цифрите вдясно от десетичната запетая в число. Прецизност е общият брой цифри в числото. Можем да посочим мащаба, като добавим число в скоби към типа данни.
Ето какво се случва, ако изрично задам часа стойност да има по-ниска мащаб от дата и час стойност.
ДЕКЛАРИРАЙТЕ @thetime time(0)SET @thetime ='23:15:59.004007'ИЗБЕРЕТЕ @thetime КАТО 'време', CAST(@thetime КАТО datetime) КАТО 'datetime';
Резултат:
+---------+------------------------------+| време | дата и час ||----------+------------------------------|| 23:15:59 | 1900-01-01 23:15:59 000 |+----------+-------------------------+предварително>Пример 3 – Изрично преобразуване с помощта на CONVERT()
Това е същото като първия пример, с изключение на това, че този път използвам
CONVERT()
функция вместоCAST()
.DECLARE @thetime timeSET @thetime ='23:15:59.004007'ИЗБЕРЕТЕ @thetime КАТО 'време', CONVERT(datetime, @thetime) КАТО 'datetime';Резултат:
+------------------+-----------------------+| време | дата и час ||------------------+----------------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------ ------+Пример 4 – Неявно преобразуване
Ето пример за правене на същото нещо, но с помощта на имплицитно преобразуване на тип.
DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSELECT @thetime КАТО 'време', @thedatetime КАТО 'datetime';Резултат:
+------------------+-----------------------+| време | дата и час ||------------------+----------------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------ ------+Така че получаваме един и същ резултат, независимо дали е изрично или неявно преобразуване.
Това е имплицитно преобразуване, защото не използваме функция за преобразуване, за да я преобразуваме изрично. Ние просто присвояваме стойността от променлива от един тип данни на променлива от друг тип данни. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да зададем време стойност към дата и час променлива.
Пример 5 – Промяна на датата
Ако трябва да промените датата (но запазите същото време), можете да използвате
DATEADD()
функция.DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSET @thedatetime =DATEADD(година, 120, @thedatetime)ИЗБЕРЕТЕ @thetime КАТО 'време', @thedatetime AS 'datetime';Резултат:
+------------------+-----------------------+| време | дата и час ||------------------+----------------------------------|| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |+------------------+------------------- ------+В този случай добавям 120 към стойността на годината, което я довежда до 2020 г.