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

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

Questo articolo contiene esempi di conversione di un tempo valore a un datetimeoffset valore in SQL Server utilizzando Transact-SQL.

Quando converti un tempo valore a datetimeoffset , la data viene impostata su "1900-01-01" e l'ora viene copiata. Viene aggiunto un fuso orario che viene impostato su +00:00.

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 datetimeoffset .

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

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Quindi una parte della data viene aggiunta e impostata su "1900-01-01", l'ora viene copiata e viene aggiunto un offset di fuso orario e impostato su +00:00.

Esempio 2 – Precisione

Nell'esempio precedente, entrambi i tipi di dati utilizzano la loro precisione/scala predefinita (7). Questo perché non ho aggiunto una scala tra parentesi (la scala determina la precisione dei secondi frazionari). Utilizzando una scala di 7, possiamo vedere che entrambi i tipi di dati sono in grado di rappresentare un valore temporale preciso a 7 cifre decimali.

In altre parole, quando inizialmente ho impostato il @thetime variabile, ho incluso 7 cifre decimali nel valore (in particolare, 1234567 ). Entrambi i tipi di dati "time" e "datetimeoffset" sono stati in grado di rappresentarli con successo perché entrambi utilizzavano una scala di 7. Anche in questo caso, sappiamo che hanno utilizzato 7 perché questo è il valore predefinito.

Giusto per essere chiari, scala è il numero di cifre a destra della virgola decimale in un numero. Precisione è il numero totale di cifre nel numero.

Possiamo ridurre la precisione frazionaria dei secondi, se necessario.

Di seguito sono riportati alcuni esempi che dimostrano cosa accade quando i tipi di dati sono impostati per utilizzare una diversa precisione frazionaria di secondi:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.0000000 +00:00 |
+------------------+------------------------------------+

In questo caso ho impostato esplicitamente il @thetime variabile per utilizzare una scala di 7. Ma quando eseguo il cast su datetimeoffset , ho impostato la scala su 0. Pertanto, il risultato per datetimeoffset il valore è una precisione di secondi frazionari inferiore. Sul mio sistema sono ancora visualizzate 7 cifre decimali, ma sono tutte 0.

Eccolo di nuovo, ma questa volta aumento la precisione dei secondi frazionari a 3 per il datetimeoffset valore:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(3)) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1230000 +00:00 |
+------------------+------------------------------------+

Quindi utilizza i primi 3 secondi frazionari (millisecondi).

Tuttavia, se aumentiamo la precisione dei secondi frazionari a 4, guarda cosa succede:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(4)) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Nell'esempio successivo aumento il valore della parte frazionaria in modo che provochi la parte non frazionaria del datetimeoffset valore da arrotondare per eccesso:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.7654321';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.7654321 | 1900-01-01 23:16:00.0000000 +00:00 |
+------------------+------------------------------------+

In questo caso, i minuti sono stati arrotondati per eccesso ei secondi a zero.

Scambialo in modo che il datetimeoffset ha una precisione superiore al tempo valore:

DECLARE @thetime time(4);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(7)) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1235000 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Ho dichiarato il @thetime variabile per utilizzare una scala di 4, ma poi ha utilizzato una scala di 7 durante la conversione in datetimeoffset tipo di dati. L'utilizzo di una precisione di 7 non è necessario, in quanto non è possibile utilizzare una precisione superiore a quella già assegnata.

Inoltre, qualsiasi arrotondamento di precisione inferiore si è già verificato nel momento in cui è stato convertito in datetimeoffset (precisione superiore) tipo di dati. Nota che il tempo tipo di dati arrotondato i secondi frazionari per eccesso dal valore iniziale che gli ho assegnato. Questo effetto di arrotondamento è passato anche al datetimeoffset valore.

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(datetimeoffset, @thetime) AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Esempio 4 – Conversione implicita

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

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00: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 datetimeoffset variabile.

Esempio 5:modifica della data

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

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SET @thedatetimeoffset = DATEADD(year, 285, @thedatetimeoffset);
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Risultato:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 2185-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

In questo caso aggiungo 285 al valore dell'anno, che lo porta a 2185.