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

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

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

Quando converti una data valore a datetimeoffset , al valore vengono aggiunte informazioni aggiuntive. Ciò è dovuto al datetimeoffset il tipo di dati contiene sia le informazioni sulla data e l'ora, sia le informazioni sulla differenza di orario. In altre parole, il datetimeoffset il tipo di dati definisce una data combinata con un'ora del giorno con riconoscimento del fuso orario e basata su un formato di 24 ore. La data il tipo di dati, invece, contiene solo informazioni sulla data.

Quando convertiamo da data a datetimeoffset , l'ora (e l'offset del fuso orario) vengono aggiunti automaticamente al valore. Tuttavia, puoi sempre modificare il valore se necessario (compreso l'offset del fuso orario).

Il datatimeoffset il tipo di dati consente inoltre di specificare la precisione dei secondi frazionari. Se non lo specifichi, usa una scala di 7. Ciò significa che includerà 7 cifre sul lato destro della virgola decimale.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra data e datetimeoffset .

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +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 datetimeoffset variabile.

Possiamo vedere che la data La variabile contiene solo informazioni sulla data, mentre datetimeoffset La variabile contiene informazioni su data, ora e fuso orario.

Quando effettui una conversione tra data e datetimeoffset(7) (vale a dire utilizzando una scala di 7), la componente temporale è impostata su 00:00:00.0000000 +00:00 . Questo è anche il valore predefinito, quindi puoi omettere il valore di precisione e utilizzerà una scala di 7 (che si traduce in una precisione di 34). Puoi ridurre la precisione se preferisci. La riduzione della precisione può anche ridurre la quantità di spazio necessaria per memorizzare il valore.

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.

Esempio 2 – 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 datetimeoffset .

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

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

Quindi otteniamo lo 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 datetimeoffset)) AS 'datetimeoffset';

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Nota che non puoi utilizzare DATEADD() funzione per modificare la componente di offset dell'ora. Ma non preoccuparti, c'è un modo per modificarlo (continua a leggere per scoprire come).

Esempio 3 – 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(datetimeoffset, @thedate) AS 'datetimeoffset';

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

E la regolazione dell'ora:

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

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Esempio 4 – Modifica del Time Offset

Negli esempi precedenti abbiamo usato DATEADD() funzione per modificare il valore del tempo. Questa funzione può essere utilizzata per modificare qualsiasi parte del componente della data o dell'ora, tranne il componente della differenza di orario .

Se hai bisogno di modificare la differenza di orario, puoi usare il TODATETIMEOFFSET() funzione. Puoi anche utilizzare questa funzione per convertire la data originale valore a un datetimeoffset valore. Questa funzione accetta un valore di data (che può essere risolto in un datetime2 value) e un valore di offset.

Ecco un esempio:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00')
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

Ed ecco un esempio che utilizza la funzione all'interno di SELECT dichiarazione:

DECLARE @thedate date = '2020-12-01'
SELECT 
  @thedate AS 'date',
  TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';

Risultato:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

Il TODATETIMEOFFSET() la funzione accetta anche un datetimeoffset value come primo parametro, quindi puoi usarlo anche per modificare datetimeoffset esistente valori se richiesti.

Esempio:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Risultato:

+------------+------------------------------------+------------------------------------+
| date       | datetimeoffset                     | Modified                           |
|------------+------------------------------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+------------------------------------+