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

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

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

Quando converti un datetimeoffset valore a datetime , i valori di data e ora vengono copiati e l'offset del fuso orario viene troncato. Quando la precisione frazionaria di datetimeoffset value è maggiore di tre cifre, il valore viene troncato.

Il datatimeoffset il tipo di dati consente di specificare una precisione frazionaria di secondi da 0 a 7. Questo viene fatto 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. Un altro byte viene utilizzato per memorizzare la precisione, quindi questo aggiunge 1 byte a quelle cifre.

La data e ora il tipo di dati, invece, ha un massimo di 3 cifre per la sua parte di secondi frazionari. La sua precisione è arrotondata a incrementi di .000, .003 o .007 secondi. Questo tipo di dati non ha riconoscimento del fuso orario e, di conseguenza, nessun offset del fuso orario. La sua dimensione di archiviazione è di 8 byte.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetimeoffset e data e ora .

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

Risultato:

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

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 datetime variabile.

Possiamo vedere che il datetime variabile ha una precisione di secondi frazionari inferiore e finiamo con una parte frazionaria di 123 anche se la parte frazionaria originale era 1234567 .

In questo caso non è stato eseguito alcun arrotondamento.

Vediamo anche che l'offset del fuso orario è stato troncato. La data e ora il tipo di dati non ha riconoscimento del fuso orario.

In questa conversione, la dimensione di archiviazione è diminuita da 10 byte (11 byte se includi il byte aggiuntivo che memorizza la precisione) per datetimeoffset , a 8 byte per datetime . Tuttavia, se il datetimeoffset value se avesse utilizzato una scala compresa tra 0 e 2, avrebbe utilizzato solo 8 byte (9 inclusa la precisione).

Se avesse utilizzato una scala di 3 (l'equivalente di datetime valore), la dimensione della memoria sarebbe stata di 9 byte (10 con precisione). Tuttavia, la sua precisione sarebbe stata superiore a datetime . Ovviamente, la precisione sarebbe diminuita non appena l'avessimo convertita in datetime .

Esempio 2 – Precisione/Accuratezza e Arrotondamento

La data e ora il tipo di dati viene arrotondato per incrementi di .000, .003 o .007 secondi. Anche se lo imposti in modo esplicito su un altro valore, verrà arrotondato.

Questo vale anche per la conversione da un altro tipo di dati (come quello che stiamo facendo qui).

Ecco un esempio che dimostra cosa intendo.

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

Risultato:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |
+------------------------------------+-------------------------+

In questo esempio, ho impostato i secondi frazionari di datetimeoffset valore a 1250000 ma data e ora arrotondato per eccesso a 127 (perché può essere arrotondato solo per incrementi di .000, .003 o .007 secondi).

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 data e ora .

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

Risultato:

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

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(datetime, @thedatetimeoffset) AS 'datetime';

Risultato:

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