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

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

Questo articolo contiene esempi di conversione di una data/ora valore a un datetime2 valore in SQL Server.

Quando converti un data/ora valore a datetime2 , il valore risultante dipenderà dalla precisione frazionaria di secondi che assegni a datetime2 .

La data e ora il tipo di dati 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.

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

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetime e dataora2 .

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

Risultato:

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

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

Possiamo vedere che il datetime2 variabile ha una precisione di secondi frazionari maggiore e ci ritroviamo con una parte frazionaria di 1233333 (rispetto a 123 per la data e ora valore).

Esempio 2 – 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. Come ci si potrebbe aspettare, questo può causare molta confusione se non sei a conoscenza di come funziona. Non solo può creare confusione quando si utilizza datetime di per sé, può causare ulteriore confusione durante la conversione di quel valore in un altro tipo di dati.

Ecco un esempio che dimostra cosa intendo.

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

Risultato:

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

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

La dataora2 valore, tuttavia, imposta i secondi frazionari su 1266667 .

A proposito, se dovessimo semplicemente impostare il valore iniziale su datetime2 in primo luogo, la sua parte frazionaria avrebbe restituito 1250000 .

Esempio 3 – Precisione/Precisione

Uno dei vantaggi di datetime2 è che ti permette di specificare la precisione dei secondi frazionari. Se non lo fai, usa 7 (quindi, l'esempio precedente usa 7).

Possiamo quindi modificare l'esempio precedente in modo che il datetime2 value utilizza la stessa precisione frazionaria di secondi di datetime tipo di dati.

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

Risultato:

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

Quando lo facciamo, il datetime2 value restituisce lo stesso risultato di datetime valore. Utilizza anche la stessa quantità di spazio di archiviazione (8 byte). In questo caso, datetime2 utilizza 7 byte per memorizzare il valore e 1 byte per memorizzare la precisione del valore.

Puoi anche specificare meno precisione frazionaria di secondi rispetto a datetime se non hai bisogno della precisione extra. In questo modo risparmierai un intero byte di spazio di archiviazione (il tuo datetime2 value utilizzerà 7 byte, rispetto agli 8 byte per il datetime valore).

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

Risultato:

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

Tieni presente che ciò potrebbe comportare anche l'arrotondamento di frazioni di secondi.

Esempio 4 – 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 datetime e dataora2 .

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

Risultato:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Esempio 5 – Conversione esplicita mediante CONVERT()

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

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

Risultato:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Raccomandamento di Microsoft

Microsoft consiglia di utilizzare il cast esplicito ogni volta che esiste uno scenario di confronto misto tra questi due tipi di dati:

Sotto il livello di compatibilità del database 130, conversioni implicite da datetime a dataora2 i tipi di dati mostrano una maggiore precisione tenendo conto dei millisecondi frazionari, risultando in valori convertiti diversi... Utilizza il cast esplicito a datetime2 tipo di dati ogni volta che uno scenario di confronto misto tra datetime e dataora2 i tipi di dati esistono.