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

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

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

Uno dei vantaggi della conversione di un datetime valore a smalldatetime è che riduci la dimensione di archiviazione da 8 byte a 4 byte. Tuttavia, perdi la precisione per farlo.

La data e ora il tipo di dati include una parte di secondi frazionari di 3 cifre. La sua precisione è arrotondata a incrementi di .000, .003 o .007 secondi.

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

Quando converti un data/ora valore a smalldatetime , viene copiata la data e parte dell'ora. La componente dei secondi viene impostata su zero (indipendentemente dal valore originale) 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 datetime e smalldatetime .

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

Risultato:

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

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

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

Risultato:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Potresti aver notato che in questo esempio ho modificato i secondi frazionari durante l'assegnazione del valore iniziale a @thedatetime . Ma perché lo sto assegnando a un datetime tipo di dati, la parte dei secondi frazionari viene arrotondata per eccesso (perché la sua precisione viene arrotondata a incrementi di .000, .003 o .007 secondi). In questo caso provo ad assegnare una frazione di secondo di 125 ma viene arrotondato a 127 .

Tuttavia, ciò non influisce su smalldatetime valore.

Esempio 3 – 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(smalldatetime, @thedatetime) AS 'smalldatetime';

Risultato:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+