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

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

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

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

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

отместването на датата и времето типът данни, от друга страна, ви позволява да зададете точност на частични секунди от 0 до 7. Ако не посочите това, той ще използва 7 (по подразбиране). Освен това има изместване на часовата зона и може да запази всякакви отмествания в оригиналната стойност. Въпреки това, datetime няма осъзнаване на часовата зона, така че няма съществуващи стойности за запазване. В този случай изместването на часовата зона е по подразбиране +00:00.

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

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

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

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +00:00 |
+-------------------------+------------------------------------+

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

Можем да видим, че datetimeoffset променливата има по-голяма точност на дробни секунди и в крайна сметка получаваме дробна част от 1233333 (срещу 123 за дата и час стойност). В крайна сметка получаваме и изместване на часовата зона от +00:00 .

Използването на точност от 7 части от секунди причинява отместване на датата и времето да използвате 10 байта за съхранение (11 байта, ако включите байта, който съхранява неговата точност). За сравнение, дата и час използва само 8 байта. Можете обаче да намалите точността на отместването на датата и времето стойност, като замените 7 с по-ниско число. Това е същата концепция като при използване на datetime2 тип данни. Вижте Преобразуване на „datetime“ в „datetime2“ в SQL Server за примери как това може да повлияе на крайния резултат.

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

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

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

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

отместването на датата и времето стойност от друга страна, задайте частичните секунди на 1266667 .

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

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

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

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

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

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

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

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

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

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

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime, '+07:00');
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

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

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Резултат:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

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

Пример:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

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

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +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. SQLServer срещу StateServer за производителност на състоянието на сесията на ASP.NET

  2. Внимание на потребителите, работещи с SQL Server 2008 и SQL Server 2008 R2

  3. Завъртане на няколко колони въз основа на една колона в SQL Server

  4. Актуализиране на пощенски акаунт в база данни (SSMS)

  5. ЗАДАДЕТЕ NOCOUNT ЗА употреба