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

Преобразуване на ‘time’ в ‘datetime2’ в SQL Server (T-SQL примери)

Тази статия съдържа примери за преобразуване на време стойност до 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 г.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Уникално ограничение за множество колони

  2. Синтаксис на for-loop в SQL Server

  3. Как работи функцията NCHAR() в SQL Server (T-SQL)

  4. Как да намалите размера на файл с данни в SQL Server (T-SQL)

  5. Знаете ли кога да опитате отново или да не успеете при извикване на SQL Server от C#?