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

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

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.