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

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

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

Когато конвертирате datetimeoffset стойност до дата и час , стойностите за дата и час се копират, а отместването на часовата зона се съкращава. Когато дробната точност на datetimeoffset стойността е по-голяма от три цифри, стойността е съкратена.

отместването на датата и времето типът данни ви позволява да зададете частична точност от секунди от 0 до 7. Това се прави с помощта на datetimeoffset(n) синтаксис. Ако не посочите това, той ще използва 7 (по подразбиране). Има и изместване на часовата зона. Размерът за съхранение на този тип данни е 8, 9 или 10 байта, в зависимост от използваната прецизност. Друг байт се използва за съхраняване на точността, така че това добавя 1 байт към тези цифри.

Дата и час типът данни, от друга страна, има максимум 3 цифри за частта от секундите. Неговата точност се закръглява до стъпки от .000, .003 или .007 секунди. Този тип данни няма информация за часовата зона и следователно няма изместване на часовата зона. Размерът му за съхранение е 8 байта.

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

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

ДЕКЛАРИРАЙТЕ @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;ИЗБЕРЕТЕ ИЗКЛ. КАТО 'datetime';

Резултат:

+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+

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

Виждаме, че datetime променливата има по-малка прецизност на дробни секунди и в крайна сметка получаваме дробна част от 123 въпреки че оригиналната дробна част беше 1234567 .

В този случай не е извършено закръгляване.

Виждаме също, че изместването на часовата зона е съкратено. Дата и час типът данни няма информация за часовата зона.

При това преобразуване размерът на паметта е намалял от 10 байта (11 байта, ако включите допълнителния байт, който съхранява точността) за datetimeoffset , до 8 байта за дата и час . Въпреки това, ако datetimeoffset value е използвал скала между 0 и 2, би използвал само 8 байта (9 включително прецизност).

Ако е използвал скала от 3 (еквивалент на дата и час стойност), размерът на съхранение би бил 9 байта (10 с точност). Точността му обаче би била по-висока от datetime . Разбира се, точността ще бъде намалена веднага след като я преобразуваме в datetime .

Пример 2 – Прецизност/точност и закръгляване

Дата и час типът данни се закръглява до стъпки от .000, .003 или .007 секунди. Дори ако изрично го зададете на друга стойност, тя ще бъде закръглена.

Това важи и при конвертиране от друг тип данни (като това, което правим тук).

Ето пример, който демонстрира какво имам предвид.

ДЕКЛАРИРАЙТЕ @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;ИЗБЕРЕТЕ ИЗКЛЮЧЕНО @thedatetime'datetime КАТО 'datetime';

Резултат:

+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+------------------------------------+- ------------------------+

В този пример зададох частните секунди на datetimeoffset стойност до 1250000 но дата и час закръгли го до 127 (тъй като може да се закръгля само до стъпки от .000, .003 или .007 секунди).

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

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

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';ИЗБЕРЕТЕ @thedatetimeoffset КАТО 'datetimeoffset', CAST(@thedatetime)offset AS;'date AS дата /предварително> 

Резултат:

+----------------------------------+-------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+

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

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

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset КАТО 'datetimeoffset', CONVERT(datetime, @thedate) AS; /предварително> 

Резултат:

+----------------------------------+--------- ----------------+| datetimeoffset | дата и час ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте номера на месеца във функция за име на месеца в SQL

  2. Три лесни победи за производителност на SQL Server

  3. Конфигурации с обхват на базата данни на SQL Server и автоматична корекция на план

  4. Условно ли е MS-SQL И/ИЛИ (извършване на оценка на късо съединение)?

  5. PIVOT заявка към различни записи