Questo articolo contiene esempi di conversione di un tempo valore a un smalldatetime valore in SQL Server.
Quando converti un tempo valore a smalldatetime , la data è impostata su "1900-01-01" e i valori di ore e minuti sono arrotondati per eccesso. I secondi e le frazioni di secondo sono impostati su 0.
Esempio 1 – 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 esplicitamente da tempo a smalldatetime .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Risultato:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Quindi viene aggiunta una parte della data e impostata su "01-01-1900", e in questo caso i valori dei minuti vengono arrotondati e i secondi impostati su 0.
La documentazione Microsoft afferma che anche i secondi frazionari sono impostati su zero, ma smalldatetime il tipo di dati non include comunque i secondi frazionari.
A proposito, ogni volta che utilizzi smalldatetime tipo di dati, il componente secondi è sempre impostato su 0.
Esempio 2:arrotondamento dell'ora
Ecco un esempio dell'ora arrotondata per eccesso:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Risultato:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
In questo caso ho anche specificato una scala di 0 per il valore del tempo, tuttavia, ciò non influisce sul risultato.
Giusto per essere chiari, scala è il numero di cifre a destra della virgola decimale in un numero. Precisione è il numero totale di cifre del numero. Quando specifichiamo una scala di 0, significa che la parte frazionaria non è inclusa.
Esempio 3 – Conversione esplicita mediante CONVERT()
Ecco un esempio usando CONVERT()
funzione invece di CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Risultato:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Esempio 4 – Conversione implicita
Ecco un esempio di come fare la stessa cosa, ma usando una conversione di tipo implicita.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Risultato:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Quindi otteniamo lo stesso risultato, indipendentemente dal fatto che si tratti di una conversione esplicita o implicita.
Questa è una conversione implicita perché non stiamo usando una funzione di conversione per convertirla in modo esplicito. Stiamo semplicemente assegnando il valore da una variabile di un tipo di dati a una variabile di un altro tipo di dati. In questo caso, SQL Server esegue una conversione implicita dietro le quinte quando proviamo ad assegnare il tempo valore a un smalldatetime variabile.
Esempio 5:modifica della data
Se devi cambiare la data (ma mantenere la stessa ora), puoi usare il DATEADD()
funzione.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Risultato:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
In questo caso aggiungo 85 al valore dell'anno, che lo porta a 1985.
Tieni presente però che smalldatetime supporta un intervallo di date molto ristretto (dal 1900-01-01 al 2079-06-06), quindi aggiungere troppo all'anno potrebbe causare un errore di overflow come quello di seguito:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Risultato:
Adding a value to a 'smalldatetime' column caused an overflow.