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

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

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

Il smalldatetime il tipo di dati non ha secondi frazionari e il relativo componente secondi è sempre impostato su zero (:00). La sua precisione è al minuto più vicino.

La dataora2 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). Se specifichi zero (0 ), la sua precisione sarà al secondo più vicino.

Quando converti un smalldatetime valore a datetime2 , le ore ei minuti vengono copiati. I secondi e le frazioni di secondo sono impostati su 0.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra smalldatetime e dataora2 .

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Risultato:

+---------------------+-----------------------------+
| smalldatetime       | datetime2                   |
|---------------------+-----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 |
+---------------------+-----------------------------+

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

In questo esempio possiamo vedere che smalldatetime il valore non include i secondi frazionari, i secondi sono stati impostati su zero e il minuto è stato arrotondato per eccesso.

In questo caso, il datetime2 value usa una precisione di 7. Questo perché 7 è il valore predefinito. Non ho specificato una precisione e quindi è stato utilizzato il valore predefinito. Ciò comporta l'utilizzo di 7 zeri nella parte frazionaria.

Esempio 2 – Rimuovere la parte frazionaria

È possibile rimuovere i secondi frazionari, se necessario. Per farlo, usa semplicemente datetime2(0) quando si dichiara la variabile.

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

Risultato:

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Quindi in questo caso entrambi i tipi di dati restituiscono lo stesso valore. Tuttavia, la differenza è che datetime2 ha la capacità di fornire precisione al secondo (rispetto a smalldatetime la precisione al minuto).

Esempio:

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime',
  DATEADD(second, 30, @thedatetime2) AS 'datetime2';

Risultato:

+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:17:00 | 2025-05-21 10:16:30 |
+---------------------+---------------------+

In questo esempio ho usato DATEADD() funzione per aggiungere 30 secondi a ciascun valore. Tuttavia, ogni tipo di dati restituisce un risultato diverso. La dataora2 il tipo di dati rispetta la parte dei secondi e fornisce il risultato corretto con una precisione del 100%. Il smalldatetime digita invece, viene arrotondato al minuto più vicino (mentre la parte dei secondi rimane a zero).

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 smalldatetime e dataora2 .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';

Risultato:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

Esempio 4 – Conversione esplicita mediante CONVERT()

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

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';

Risultato:

+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+