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

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

Se hai un datetimeoffset valore, ma non è necessaria la parte di offset dell'ora e del fuso orario, convertendola in data ti farà risparmiare molto spazio di archiviazione (rimuovendo i dettagli non necessari dal valore). Questo articolo contiene esempi di conversione di un datetimeoffset valore a una data valore in SQL Server.

Il datatimeoffset il tipo di dati include la data e l'ora con una differenza di fuso orario. Ha anche una parte di secondi frazionari compresa tra 0 e 7 (questo dipende da quanti secondi frazionari gli vengono assegnati). Questo viene fatto usando datetimeoffset(n) sintassi. Se non lo specifichi, utilizzerà 7 (l'impostazione predefinita). La dimensione di archiviazione di questo tipo di dati è 8, 9 o 10 byte (più 1 byte per memorizzare la precisione), a seconda della precisione utilizzata. La sua precisione è di 100 nanosecondi.

La data il tipo di dati, invece, include solo la data. Non include l'ora e ha una precisione di 1 giorno. Utilizza 3 byte per l'archiviazione.

Quando converti un datetimeoffset valore a una data tipo di dati, si perde la parte dell'ora (incluso l'offset del fuso orario). Tuttavia, riduci anche la dimensione di archiviazione a 3 byte fissi. Ovviamente, faresti questa conversione solo se non hai bisogno della parte oraria e dell'offset del fuso orario.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetimeoffset e data .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedate date;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thedate = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedate AS 'date';

Risultato:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

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 il datetimeoffset valore a una data variabile.

Qui possiamo vedere che la data il valore include solo la data (senza il componente ora). Il componente orario, incluso il relativo offset di fuso orario, è stato rimosso dal valore.

In questo esempio, il datetimeoffset value utilizza la precisione predefinita (che risulta in 7 cifre decimali). Ciò si traduce nel tipo di dati che utilizza 10 byte (in realtà, 11 byte se si conteggia il byte aggiuntivo che memorizza la precisione). La data value utilizza solo 3 byte.

Esempio 2 – Conversione esplicita mediante CAST()

Ecco un esempio di conversione esplicita. In questo caso, utilizzo il CAST() funzione direttamente all'interno di SELECT istruzione da convertire in modo esplicito tra datetimeoffset e data .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS date) AS 'date'; 

Risultato:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

Esempio 3 – Conversione esplicita mediante CONVERT()

Ecco un esempio di una conversione esplicita utilizzando CONVERT() funzione invece di CAST() .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(date, @thedatetimeoffset) AS 'date';

Risultato:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+