Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразувайте „smalldatetime“ в „time“ в SQL Server (T-SQL примери)

Тази статия съдържа примери за преобразуване на smalldatetime стойност до време стойност в SQL Server.

Когато конвертирате smalldatetime стойност до време , губите датата. Часовете, минутите и секундите се копират. Частичните секунди са настроени на 0.

Smalldatetime типът данни включва както датата, така и часа. Времето обаче няма частни секунди и неговият компонент на секундите винаги е настроен на нула (:00). Неговата точност е до най-близката минута. Размерът му за съхранение е 4 байта.

Времетота тип данни от друга страна, включва само времето. Въпреки това, той ви позволява да зададете частична точност от секунди от 0 до 7. Това се постига с помощта на времето (n ) синтаксис, където n е скалата от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране), което осигурява точност от 100 наносекунди. Ако посочите нула (0 ), точността му ще бъде до най-близката секунда. Размерът му за съхранение ще бъде 3, 4 или 5 байта (плюс 1 байт за съхраняване на точността), в зависимост от точността на части от секундите.

Пример 1 – Неявно преобразуване

Ето пример за имплицитно преобразуване между дата и час ивреме .

DECLARE @thesmalldatetime smalldatetime, @thetime time;SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thetime =@thesmalldatetime;SELECT @thesmalldatetime КАТО 'smalldatetime', @thetime КАТО;

Резултат:

+---------------------+---------+| smalldatetime | време ||---------------------+---------|| 21.05.2025 10:16:00 | 10:16:00 |+---------------------+----------+

Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server изпълнява неявно преобразуване зад кулисите, когато се опитваме да присвоим smalldatetime стойност до време променлива.

Най-очевидното нещо в този резултат е, че ввремета стойността не включва датата. Това е очаквано, тъй като врема типът данни е единствено за съхранение на стойности за време, а не стойности за дата.

Какво е не очевидно (поне с моя пример) е, че стойността на времето всъщност може да се справи с част от секунди. Моята система не показва дробните секунди тук, но следващият пример ще покаже, че всъщност има точност на дробни секунди от 7.

Освен това, ако се вгледате внимателно, ще видите, че smalldatetime value закръгли минутите от действителната стойност, която се опитвах да му присвоя. Това отразява относително ниската прецизност на smalldatetime тип данни. Прецизността му е с точност до минута. Очевидната последица от това е, че когато в крайна сметка пренастроим стойността му на времета тип данни, това е закръглената стойност, която е присвоена, а не първоначалната стойност, която се опитах да присвоя. Ако бяхме присвоили първоначалната стойност директно на времета променлива, щяхме да получим по-точна стойност (дори и да сме посочили скала от 0).

Ето какво имам предвид:

DECLARE @thesmalldatetime smalldatetime, @thetime time(0);SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thetime ='2025-05-21 10:15:30';ИЗБЕРЕТЕ @thesmalldatetime AS 'smalldatetime', @thetime AS 'време';

Резултат:

+---------------------+---------+| smalldatetime | време ||---------------------+---------|| 21.05.2025 10:16:00 | 10:15:30 |+---------------------+----------+

Пример 2 – Добавяне на дробни секунди

Smalldatetime типът данни няма част от секунди, но в първия ни пример времето стойността има частична точност от 7 (въпреки че всъщност не показва никакви десетични знаци). Знам точността му, защото не посочих мащаб, когато го декларирах, следователно използва мащаба си по подразбиране от 7.

Ето пример, за да потвърдите, че времето стойността всъщност може да поддържа дробна част:

DECLARE @thesmalldatetime smalldatetime, @thetime time;SET @thesmalldatetime ='2025-05-21 10:15:30';SET @thetime =@thesmalldatetime;SELECT @thesmalldatetime AS 'smalldatetime', @rithetime КАТО време ', DATEADD(nanosecond, 123456700, @thetime) КАТО 'Променено време';

Резултат:

+---------------------+----------------+------ ------------+| smalldatetime | Оригинално време | Променено време ||---------------------+----------------+------ ------------|| 21.05.2025 10:16:00 | 10:16:00 | 10:16:00.1234567 |+---------------------+----------------+--- ---------------+

Имайте предвид, че когато начас стойността има мащаб 7, има размер на съхранение от 5 байта. Следователно той има по-високи изисквания за съхранение от smalldatetime тип (който използва само 4 байта).

Пример 3 – Изрично преобразуване с помощта на CAST()

Ето пример за изрично преобразуване. В този случай използвам CAST() функция директно в SELECT изявление за изрично преобразуване между smalldatetime ивреме .

DECLARE @thesmalldatetime smalldatetime;SET @thesmalldatetime ='2025-05-21 10:15:30.125';SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS time(0)) AS';

Резултат:

<пред>+---------------------+-----------+| smalldatetime | време(0) ||---------------------+-----------|| 21.05.2025 10:16:00 | 10:16:00 |+---------------------+-----------+

В този пример зададох мащаба на 0.

Пример 4 – Изрично преобразуване с помощта на CONVERT()

Ето пример за изрично преобразуване с помощта на CONVERT() функция вместо CAST() .

DECLARE @thesmalldatetime smalldatetime;SET @thesmalldatetime ='2025-05-21 10:15:30.125';ИЗБЕРЕТЕ @thesmalldatetime КАТО 'smalldatetime', CONVERT(time(0), @thesmalldatetime(0) AS';

Резултат:

+---------------------+-----------+| smalldatetime | време(0) ||---------------------+-----------|| 21.05.2025 10:16:00 | 10:16:00 |+---------------------+-----------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ЗАДАДЕТЕ NOCOUNT ЗА употреба

  2. LOG10() Примери в SQL Server

  3. DATENAME() Примери в SQL Server

  4. Как да направите база данни онлайн от режим на възстановяване в SQL Server

  5. EXISTS срещу JOIN и използване на клауза EXISTS