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

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

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

Uno dei vantaggi della conversione di un datetime2 valore a smalldatetime è che riduci la dimensione di archiviazione da 7, 8 o 9 byte a 4 byte. Tuttavia, perdi 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). Se specifichi zero (0 ), la sua precisione sarà al secondo più vicino.

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

Quando converti un datetime2 valore a smalldatetime , viene copiata la data e parte dell'ora. La componente dei secondi viene impostata su zero (indipendentemente dal valore originale della componente dei secondi) e l'ora viene arrotondata al minuto più vicino. Eventuali secondi frazionari vengono rimossi.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetime2 e smalldatetime .

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

Risultato:

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

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

Ma avrebbe restituito lo stesso risultato indipendentemente dalla precisione che ho scelto. Anche se l'avessi ridotto a zero (cioè dichiarato come datetime2(0) ), avrebbe comunque restituito lo stesso risultato.

Esempio 2 – 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 smalldatetime .

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

Risultato:

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

In questo esempio ho deciso di utilizzare una scala pari a zero per datetime2 valore (ovvero datetime2(0) ), tuttavia, ciò non influisce sul smalldatetime risultante valore.

Esempio 3 – Conversione esplicita mediante CONVERT()

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

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

Risultato:

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