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

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

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

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

La dataora2 il tipo di dati è fondamentalmente un'estensione di datetime tipo di dati. Ha un intervallo di date più ampio, una precisione frazionaria predefinita più ampia e una precisione specificata dall'utente facoltativa.

In ogni caso, il processo di conversione è esattamente lo stesso indipendentemente dal tipo di dati. L'unica differenza è la quantità di informazioni disponibili tra la data , data e ora e dataora2 .

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra data e dataora2 .

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Risultato:

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

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

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

Inoltre, otteniamo più informazioni sull'ora di quante ne otterremmo se le convertissimo in datetime tipo di dati.

Quando effettui una conversione tra data e dataora2 utilizzando la precisione predefinita (7), la componente temporale è impostata su 00:00:00.0000000 (rispetto a 00:00:00.000 per data e ora ). Puoi ridurre la precisione se preferisci (vedi sotto). La riduzione della precisione può anche ridurre la quantità di spazio necessaria per memorizzare il valore.

Il motivo per cui il componente dell'ora è tutto 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).

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, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Risultato:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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

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

Risultato:

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

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, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Risultato:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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(datetime2, @thedate) AS 'datetime2';

Risultato:

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

E la regolazione dell'ora:

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

Risultato:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Esempio 5 – Precisione

La dataora2 il tipo di dati consente di specificare la precisione (fino al valore predefinito 7). In altre parole, non è necessario utilizzare tutte le 7 cifre se non è necessario.

Esempio:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
  CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';

Risultato:

+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

Un vantaggio della riduzione della precisione è che può anche ridurre la quantità di spazio necessaria per memorizzare il valore. In particolare, 6 byte per precisione inferiore a 3, 7 byte per precisione 3 o 4 e tutte le altre precisioni richiedono 8 byte. Tuttavia, tieni presente che il primo byte viene utilizzato per memorizzare la precisione, quindi il valore effettivo è la dimensione di archiviazione indicata qui più 1 byte aggiuntivo per memorizzare la precisione.