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

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

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

Quando converti un datetimeoffset valore a datetime2 , la data e l'ora vengono copiate in datetime2 valore e il fuso orario viene troncato. Anche i secondi frazionari vengono troncati per adattarsi se la precisione della destinazione è inferiore.

Il datatimeoffset il tipo di dati consente di specificare una precisione frazionaria di secondi da 0 a 7 utilizzando il datetimeoffset(n) sintassi. Se non lo specifichi, utilizzerà 7 (l'impostazione predefinita). Ha anche un offset di fuso orario. La dimensione di archiviazione di questo tipo di dati è 8, 9 o 10 byte, a seconda della precisione utilizzata.

La dataora2 il tipo di dati consente inoltre di specificare una precisione frazionaria di secondi da 0 a 7 (utilizzando il datetime2(n) sintassi). Non ha consapevolezza del fuso orario. La sua dimensione di archiviazione è 6, 7 o 8, a seconda della precisione utilizzata.

Si noti che gli importi di archiviazione elencati qui sono gli importi elencati nella documentazione Microsoft. Tuttavia, questi tipi di dati utilizzano anche 1 byte per memorizzare la precisione. Pertanto, aggiungi 1 byte agli importi qui elencati per un quadro più completo dei requisiti di archiviazione.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetimeoffset e dataora2 .

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

Risultato:

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

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 datetimeoffset valore a un datetime2 variabile.

In questo esempio, entrambi i tipi di dati utilizzano la precisione predefinita (7 cifre decimali). Pertanto, la parte frazionaria era 1234567 per entrambi i risultati.

Vediamo anche che l'offset del fuso orario è stato troncato:il datetime2 il tipo di dati non ha riconoscimento del fuso orario.

In questa conversione, la dimensione dello spazio di archiviazione è diminuita da 10 byte (per datetimeoffset ) a 8 byte (per datetime2 ), anche se si noti che viene aggiunto 1 byte per memorizzare la precisione.

Esempio 2 – Precisione diversa

Ecco un esempio che mostra cosa succede se il datetime2 value utilizza una precisione inferiore a datetimeoffset valore.

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

Risultato:

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

In questo esempio, il datetimeoffset ha una scala di 7 ma il datetime2 value ha una scala di appena 3 . Pertanto, i secondi frazionari sono stati troncati per adattarsi.

Si noti che ciò potrebbe causare l'arrotondamento. Ecco un esempio in cui la parte frazionaria di datetime2 il valore viene arrotondato a 124 .

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

Risultato:

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

Esempio 3 – Conversione esplicita mediante CAST()

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

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

Risultato:

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

Esempio 4 – Conversione esplicita mediante CONVERT()

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

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

Risultato:

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