Database.Guide

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

Quando si converte un valore di data in smalldatetime, vengono aggiunte informazioni extra al valore. Questo perché il tipo di dati smalldatetime contiene sia informazioni di data che di tempo. Il tipo di dati data, d’altra parte, contiene solo informazioni sulla data.

Tuttavia, ci sono casi in cui una conversione da data a smalldatetime potrebbe fallire. In particolare, se il valore della data è al di fuori dell’intervallo supportato da smalldatetime, allora fallirà con un errore.

In ogni caso, qui sotto ci sono esempi di conversione tra questi due tipi di dati.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra data e smalldatetime.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Questa è una conversione implicita perché non stiamo usando una funzione di conversione (come quelle sotto) per convertirla esplicitamente. In questo caso, SQL Server esegue una conversione implicita dietro le quinte quando cerchiamo di assegnare il valore della data a una variabile smalldatetime.

Possiamo vedere che la variabile date contiene solo informazioni sulla data, mentre la variabile smalldatetime contiene sia la data che l’ora.

Quando si converte tra date e smalldatetime, il componente tempo è impostato su 00:00:00. Questo fornisce una precisione al minuto.

La ragione per cui sono tutti zeri è perché il valore della data non contiene alcuna informazione temporale, quindi non c’è modo per SQL Server di sapere che tempo vuoi (se esiste).

Ovviamente, si ottiene questo risultato anche se si assegna semplicemente un valore di sola data a uno smalldatetime senza eseguire una conversione:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';

Risultato:

+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+

Esempio 2 – Modificare il tempo

Se avete bisogno di specificare un tempo (ma mantenere la stessa data), potete usare la funzione DATEADD() per fare proprio questo.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Esempio 3 – Conversione esplicita con CAST()

Ecco un esempio di conversione esplicita. In questo caso, uso la funzione CAST() direttamente nella dichiarazione SELECT per convertire esplicitamente tra data e smalldatetime.

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Stesso risultato della conversione implicita.

Possiamo anche regolare l’ora in questo modo:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Esempio 4 – Conversione esplicita usando CONVERT()

Ecco un esempio di conversione esplicita usando la funzione CONVERT() invece di CAST().

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

E regolando l’ora:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';

Risultato:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+

Esempio 5 – Errore fuori intervallo

Come detto, se la data è fuori dall’intervallo supportato dal tipo di dati smalldatetime, si ottiene un errore.

DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';

Risultato:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

Il tipo di dati smalldatetime supporta solo intervalli di date dal 1900-01-01 al 2079-06-06.

Inoltre, il tipo di dati smalldatetime supporta solo gli intervalli di tempo da 00:00:00 a 23:59:59, quindi otterrete anche un errore se cercate di usare un valore al di fuori di questo intervallo (per esempio, con una precisione maggiore).

Esempio:

DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';

Risultato:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

Tuttavia, in questo caso, non è un errore durante la conversione, è in realtà un errore durante l’utilizzo della funzione DATEADD() (perché la funzione non permette di utilizzare quella particolare parte di data su un tipo di dati smalldatetime).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.