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

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

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

Когато конвертирате datetime2 стойност на datetimeoffset , резултантната стойност ще зависи от точността на частни секунди, която е присвоена на всеки тип данни, както и от всяко изместване на часовата зона, което посочите.

И двата типа данни ви позволяват да зададете точност на частични секунди от 0 до 7. Ако не посочите това, се използва скалата по подразбиране от 7.

отместването на датата и времето типът данни включва изместване на часовата зона и може да запази всякакви отмествания в оригиналната стойност. Въпреки това, datetime2 няма осъзнаване на часовата зона, така че няма съществуващи стойности за запазване. В този случай изместването на часовата зона е по подразбиране +00:00.

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

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

Първо, ето пример за имплицитно преобразуване между datetime2 и datetimeoffset .

DECLARE @thedatetime2 datetime2(7), @thedatetimeoffset datetimeoffset(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thedatetimeoffset =@thedatetime2;ИЗБЕРЕТЕ КАТО @thedatetime2 КАТО @thedatetime2 @thedatetimeoffset AS 'datetimeoffset(7)';

Резултат:

+----------------------------+---------------- --------------------+| дата и час2 | datetimeoffset(7) ||----------------------------+-------------- ---------------------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |+----------------------------+---- --------------------------------+

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

Можем да видим, че datetimeoffset променливата може да използва същата точност като datetime2 стойност (7 знака след десетичната запетая). В крайна сметка получаваме и изместване на часовата зона от +00:00 .

Използването на точност от 7 части от секунди причинява отместване на датата и времето да използвате 11 байта за съхранение (10 за данните и 1 байт за прецизността). datetime2 Типът използва 9 байта (8 за данните и 1 байт за прецизността), когато използва скала от 7.

Въпреки това, можете да намалите точността, като замените 7 с по-ниско число.

Пример 2 – Закръгляване

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

Ето един пример:

DECLARE @thedatetime2 datetime2(7), @thedatetimeoffset datetimeoffset(6);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thedatetimeoffset =@thedatetime2;(SELECT @thedatetime2 КАТО @thedatetime2 )', @thedatetimeoffset AS 'datetimeoffset(6)';

Резултат:

+----------------------------+---------------- --------------------+| дата и час2(7) | datetimeoffset(6) ||----------------------------+-------------- ---------------------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |+----------------------------+---- --------------------------------+

В този пример datetime2 стойността има мащаб от 7, но отместването на датата и времето Мащабът на стойността е само 6. Следователно точността му е само до 6 знака след десетичната запетая, а шестата й цифра се закръглява до 7 (вместо 6).

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

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

DECLARE @thedatetime2 datetime2;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CAST(@thedatetime2 AS datetimeoffset) КАТО 'datetimeoff> 

Резултат:

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

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

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

DECLARE @thedatetime2 datetime2;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', CONVERT(datetimeoffset, @thedatetime2) AS '; 

Резултат:

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

Пример 5 – Промяна на отместването на часовата зона

Ако конвертирате от datetime2 до datetimeoffset , вероятно го правите за изместване на часовата зона. Също така е много вероятно да имате нужда от стойност, различна от +00:00 по подразбиране.

За щастие можете да използвате TODATETIMEOFFSET() функция за промяна на отместването.

Можете също да използвате тази функция, за да конвертирате оригиналния datetime2 стойност към datetimeoffset стойност. Тази функция приема всяка стойност за дата/час, която може да се разреши до datetime2 стойност и стойност на изместване.

Ето един пример:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thedatetimeoffset =TODATETIMEOFFSET(@thedatetime2:'teda'+07 AS); 'datetime2', @thedatetimeoffset AS 'datetimeoffset';

Резултат:

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

И ето пример за използване на функцията в SELECT изявление:

DECLARE @thedatetime2 datetime2 ='2025-05-21 10:15:30.1234567';ИЗБЕРЕТЕ @thedatetime2 КАТО 'datetime2', TODATETIMEOFFSET(@thedatetime2, '+07:00') КАТО 'datetimeoffset' 

Резултат:

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

Една важна точка за TODATETIMEOFFSET() функцията е, че използва същата дробна точност като предадения към нея аргумент дата/час.

Следователно, ако вашата datetime2 използва по-ниска прецизност от datetimeoffset , винаги можете да го пренастроите на променлива с по-висока точност, след което да предадете тази преобразувана стойност на TODATETIMEOFFSET() .

Пример:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);SET @lowprecision ='2025-05-21 10:15:30.123';SET @highprecision =@lowprecision;ИЗБЕРЕТЕ @lowprecision КАТО 'lowprecision', @highprecision КАТО 'висока точност', TODATETIMEOFFSET(@highprecision, '+07:00') КАТО 'Променено';

Резултат (с помощта на вертикален изход):

ниска точност | 2025-05-21 10:15:30.123висока точност | 21.05.2025 10:15:30.1230000Променено | 2025-05-21 10:15:30.1230000 +07: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. Как RANK() работи в SQL Server

  2. Как да съхранявате директория/йерархия/дървовидна структура в базата данни?

  3. Как да изключа дните на уикенда в заявка на SQL Server?

  4. Вътрешни елементи на седемте сорта SQL сървъри – част 1

  5. Консолидиране на екземпляр на SQL Server чрез клъстериране и подреждане