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

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

Ако имате отместване на датата и времето стойност, но не се нуждаете от частта за отместване на датата и часовата зона, като я преобразувате в час ще ви спести много място за съхранение (като същевременно премахва ненужните подробности от стойността). Тази статия съдържа примери за преобразуване на datetimeoffset стойност до време стойност в SQL Server.

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

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

Когато конвертирате datetimeoffset стойност до време тип данни, губите частта с дата. Освен това губите изместване на часовата зона. Въпреки това, вие също така намалявате размера на съхранение от между 8 и 10 байта до 3, 4 или 5 байта. Въпреки това, бихте направили това преобразуване само ако не се нуждаете от частта за дата или отместването на часовата зона.

Имайте предвид, че изброените тук количества за съхранение са количествата, изброени в документацията на Microsoft. Тези типове данни обаче също използват 1 байт за съхранение на точността. Следователно, ще трябва да добавите 1 байт към изброените тук суми.

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

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Резултат:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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

Тук можем да видим, че евремета стойността включва само часа (без компонента за дата). Компонентите за изместване на датата и часовата зона са премахнати от стойността.

В този пример и двата типа данни използват точността по подразбиране (което води до 7 знака след десетичната запетая). Това води до отместване на датата и времето стойност с помощта на 10 байта и времето стойност с помощта на 5 байта.

Пример 2 – Прецизност

Точният резултат ще зависи от настройките за прецизност за всеки тип данни. В следващия пример времето стойността използва по-ниска прецизност спрямо оригиналния datetimeoffset стойност:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Резултат:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Моята система показва крайни нули, но въпросът е, че времето стойността вече има точност до само 3 знака след десетичната запетая в сравнение със 7-те знака след десетичната запетая, които използва оригиналната стойност.

Намаляването на точността може също да доведе до време стойността се закръглява нагоре. Ето един пример:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Резултат:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

В този случай получаваме дробна част от 124 вместо 123 , тъй като следната цифра е била 5 или по-голяма.

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

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

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS time) AS 'time'; 

Резултат:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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

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

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Резултат:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

  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 команди в една SQL връзка?

  2. SELECT DISTINCT игнорира различни случаи

  3. Йерархичен списък с типове тригерни събития в SQL Server 2019

  4. Как да почистя (предотвратя SQL инжектирането) динамичен SQL в SQL Server?

  5. pyodbc не може да се свърже с базата данни