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

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

Probabilmente ci sono pochissimi casi d'uso che ti porterebbero a convertire un datetime2 valore a datetime in SQL Server. In particolare, il datetime2 il tipo di dati può essere impostato per utilizzare la stessa dimensione di archiviazione di datetime , ma con maggiore precisione. Quindi nella maggior parte dei casi starai meglio con datetime2 che con un data/ora . Microsoft consiglia inoltre di utilizzare datetime2 invece di data e ora .

Tuttavia, nel caso in cui ti trovi nella situazione in cui devi eseguire questa conversione, questo articolo contiene alcuni esempi e considerazioni che potrebbero essere di aiuto.

Quando converti un datetime2 valore a datetime , il valore risultante dipenderà dai secondi frazionari assegnati a datetime2 valore, così come la sua precisione.

La dataora2 il tipo di dati consente di specificare una precisione frazionaria di secondi da 0 a 7. Se non lo specifichi, utilizzerà 7 (impostazione predefinita).

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

Pertanto, se il datetime2 utilizza una scala di 3, il valore risultante sarà molto vicino (se non identico) al valore originale. Tuttavia, a causa della minore precisione di datetime , i risultati possono essere diversi, a causa dell'arrotondamento che esegue.

Esempio 1 – Conversione implicita

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

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Risultato:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 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 datetime2 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.

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 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Risultato:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

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

È importante notare che questo sarà ancora vero, anche se assegniamo solo 3 secondi frazionari a datetime2 valore.

Esempio:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Risultato:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Vale anche la pena di essere a conoscenza di qualsiasi arrotondamento che potrebbe verificarsi all'originale datetime2 valore. La dataora2 il valore stesso potrebbe essere arrotondato per eccesso se proviamo ad assegnare un valore con più secondi frazionari rispetto alla sua stessa scala.

Esempio:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Risultato:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

In questo caso, provo ad assegnare un valore con una parte frazionaria di 1256789 . Tuttavia, poiché datetime2(3) il valore ha solo una scala di 3, può supportare solo 3 cifre decimali e, in questo caso, l'ultima cifra viene arrotondata per eccesso (perché la cifra successiva è 5 o superiore).

Entrambi datetime2(3) e data e ora utilizzare la stessa quantità di spazio di archiviazione (8 byte). La dataora2(3) il tipo di dati utilizza effettivamente 7 byte per memorizzare i dati, ma 1 byte in più per memorizzare la precisione.

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

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

Risultato:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 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 @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Risultato:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+