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

Esempi di conversione di "time" in "datetime" in SQL Server (T-SQL)

Questo articolo contiene esempi di conversione di un tempo valore a un datetime valore in SQL Server.

Quando converti un tempo valore a datetime , al valore vengono aggiunte informazioni aggiuntive. Questo perché il datetime il tipo di dati contiene informazioni sulla data e sull'ora. Il tempo il tipo di dati, d'altra parte, contiene solo informazioni sull'ora. Pertanto, le informazioni sulla data vengono aggiunte al valore quando si esegue tale conversione. In particolare, la data è impostata su "01-01-1900".

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 data e ora .

DECLARE @thetime time
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Risultato:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Quando effettui una conversione da tempo a data e ora , il componente data è impostato su 1900-01-01 .

Si noti inoltre che il valore del tempo stesso è presentato in modo diverso in entrambi questi tipi di dati. Il tempo il tipo di dati aggiunge uno zero alla fine (perché ha una precisione maggiore:la sua scala predefinita è 7). D'altra parte, datetime i valori utilizzano una scala inferiore e vengono arrotondati per incrementi di .000, .003 o .007 secondi. Se trovi questo problema, considera la conversione a datetime2 invece.

Esempio 2 – Precisione/Scala inferiore

Nell'esempio precedente, il tempo value aveva una precisione frazionaria di secondi maggiore rispetto a datetime valore. Questo perché utilizza una scala predefinita di 7. Ma possiamo cambiarla a un valore inferiore, se necessario.

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. Possiamo specificare la scala aggiungendo un numero tra parentesi al tipo di dati.

Ecco cosa succede se imposto esplicitamente l'ora valore per avere un inferiore scala rispetto a datetime valore.

DECLARE @thetime time(0)
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Risultato:

+----------+-------------------------+
| time     | datetime                |
|----------+-------------------------|
| 23:15:59 | 1900-01-01 23:15:59.000 |
+----------+-------------------------+

Esempio 3 – Conversione esplicita mediante CONVERT()

Questo è lo stesso del primo esempio, tranne che questa volta uso il CONVERT() funzione invece di CAST() .

DECLARE @thetime time
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CONVERT(datetime, @thetime) AS 'datetime';

Risultato:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Esempio 4 – Conversione implicita

Ecco un esempio di come fare la stessa cosa, ma usando una conversione di tipo implicita.

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Risultato:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

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 datetime variabile.

Esempio 5:modifica della data

Se devi cambiare la data (ma mantenere la stessa ora), puoi usare il DATEADD() funzione.

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SET @thedatetime = DATEADD(year, 120, @thedatetime)
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Risultato:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |
+------------------+-------------------------+

In questo caso aggiungo 120 al valore dell'anno, che lo porta al 2020.