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

Esempi di conversione di "date" in "smalldatetime" in SQL Server (T-SQL)

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

Quando converti una data valore a smalldatetime , al valore vengono aggiunte informazioni aggiuntive. Questo perché smalldatetime il tipo di dati contiene informazioni sulla data e sull'ora. La data il tipo di dati, invece, contiene solo informazioni sulla data.

Tuttavia, ci sono casi in cui una data a smalldatetime la conversione potrebbe non riuscire. In particolare, se la data il valore è al di fuori dell'intervallo supportato da smalldatetime quindi fallirà con un errore.

In ogni caso, di seguito sono riportati 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 smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SELECT 
  @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 in modo esplicito. In questo caso, SQL Server esegue una conversione implicita dietro le quinte quando proviamo ad assegnare la data valore a un smalldatetime variabile.

Possiamo vedere che la data La variabile contiene solo informazioni sulla data, mentre smalldatetime La variabile contiene informazioni sulla data e sull'ora.

Quando effettui una conversione tra data e smalldatetime , la componente temporale è impostata su 00:00:00 . Ciò garantisce una precisione al minuto.

Il motivo per cui sono tutti zeri è perché il valore della data non contiene informazioni sull'ora, quindi non c'è modo per SQL Server di sapere a che ora si desidera (se presente).

Ovviamente, ottieni questo risultato anche se assegni semplicemente un valore di sola data a un 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 – Modifica dell'ora

Se devi specificare un'ora (ma mantenere la stessa data), puoi utilizzare il DATEADD() funzione per fare proprio questo.

DECLARE @thedate date, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SET @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 mediante CAST()

Ecco un esempio di conversione esplicita. In questo caso, utilizzo il CAST() funzione direttamente all'interno di SELECT dichiarazione da convertire esplicitamente tra data e smalldatetime .

DECLARE @thedate date
SET @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 date
SET @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 mediante CONVERT()

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

DECLARE @thedate date
SET @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 la regolazione dell'ora:

DECLARE @thedate date
SET @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 portata

Come accennato, se la data è al di fuori dell'intervallo supportato da smalldatetime tipo di dati, riceverai un errore.

DECLARE @thedate date
SET @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 smalldatetime il tipo di dati supporta solo gli intervalli di date dal 1900-01-01 al 2079-06-06.

Inoltre, il smalldatetime il tipo di dati supporta solo gli intervalli di tempo da 00:00:00 a 23:59:59, quindi riceverai un errore anche se tenti di utilizzare un valore al di fuori di tale intervallo (ad esempio, con una precisione maggiore).

Esempio:

DECLARE @thedate date
SET @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 di DATEADD() funzione (perché la funzione non consente di utilizzare quella particolare parte di data su un smalldatetime tipo di dati).