Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti "datetime2" in "datetimeoffset" in SQL Server (esempi T-SQL)

Questo articolo contiene esempi di conversione di un datetime2 valore a un datetimeoffset valore in SQL Server.

Quando converti un datetime2 valore a datetimeoffset , il valore risultante dipenderà dalla precisione frazionaria di secondi assegnata a ciascun tipo di dati, nonché da qualsiasi offset di fuso orario specificato.

Entrambi i tipi di dati consentono di specificare una precisione frazionaria di secondi da 0 a 7. Se non lo specifichi, viene utilizzata la scala predefinita di 7.

Il datatimeoffset il tipo di dati include uno scostamento di fuso orario e può conservare eventuali scostamenti nel valore originale. Tuttavia, datetime2 non ha consapevolezza del fuso orario, quindi non ci sono valori esistenti da preservare. In questo caso, l'offset di fuso orario predefinito è +00:00.

Il TODATETIMEOFFSET() è stata progettata specificamente per convertire un valore di data/ora in datetimeoffset e aggiungi un offset di fuso orario. Tuttavia, vedi i miei commenti (ed esempi) di seguito relativi a questa opzione.

Esempio 1 – Conversione implicita

Innanzitutto, ecco un esempio di conversione implicita tra datetime2 e datetimeoffset .

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

Risultato:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Questa è una conversione implicita perché non stiamo usando una funzione di conversione (come quelle sotto) per convertirla in modo esplicito. In questo caso, SQL Server esegue una conversione implicita dietro le quinte quando proviamo ad assegnare il datetime2 valore a un datetimeoffset variabile.

Possiamo vedere che il datetimeoffset è in grado di utilizzare la stessa precisione di datetime2 valore (7 cifre decimali). Ci ritroviamo anche con uno scostamento del fuso orario di +00:00 .

L'utilizzo di una precisione di 7 secondi frazionari provoca datetimeoffset utilizzare 11 byte per la memorizzazione (10 per i dati e 1 byte per la precisione). La dataora2 tipo utilizza 9 byte (8 per i dati e 1 byte per la precisione) quando si utilizza una scala di 7.

Tuttavia, puoi ridurre la precisione sostituendo il 7 con un numero inferiore.

Esempio 2 – Arrotondamento

Se datetimeoffset ha una precisione inferiore a datetime2 valore, verrà arrotondato per eccesso.

Ecco un esempio:

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

Risultato:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

In questo esempio, datetime2 value ha una scala di 7 ma il datetimeoffset la scala del valore è solo 6. Pertanto, la sua precisione è solo di 6 cifre decimali e la sua sesta cifra viene arrotondata a 7 (invece di 6).

Esempio 3 – Conversione esplicita mediante CAST()

Ecco un esempio di conversione esplicita. In questo caso, utilizzo il CAST() funzione direttamente all'interno di SELECT dichiarazione da convertire in modo esplicito tra datetime2 e datetimeoffset .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Risultato:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Esempio 4 – Conversione esplicita mediante CONVERT()

Ecco un esempio di una conversione esplicita utilizzando CONVERT() funzione invece di CAST() .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Risultato:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Esempio 5 – Modifica dell'offset del fuso orario

Se stai convertendo da datetime2 a datetimeoffset , probabilmente lo stai facendo per l'offset del fuso orario. È anche molto probabile che tu abbia bisogno di un valore diverso da quello predefinito +00:00.

Fortunatamente, puoi usare TODATETIMEOFFSET() funzione per modificare l'offset.

Puoi anche utilizzare questa funzione per convertire il datetime2 originale valore a un datetimeoffset valore. Questa funzione accetta qualsiasi valore di data/ora che può risolversi in un datetime2 valore e un valore di offset.

Ecco un esempio:

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

Risultato:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Ed ecco un esempio che utilizza la funzione all'interno di SELECT dichiarazione:

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

Risultato:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Un punto importante su TODATETIMEOFFSET() funzione è che utilizza la stessa precisione frazionaria dell'argomento data/ora passato.

Pertanto, se il tuo datetime2 utilizza una precisione inferiore a datetimeoffset , puoi sempre riassegnarlo a una variabile con una precisione maggiore, quindi passare quel valore convertito a TODATETIMEOFFSET() .

Esempio:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Risultato (usando l'output verticale):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00