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

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

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

Quando converti un datetimeoffset valore a smalldatetime , la data e l'ora vengono copiate. I minuti vengono arrotondati per eccesso (a seconda del valore dei secondi) e i secondi vengono impostati a 0.

Il datatimeoffset il tipo di dati consente di specificare una precisione frazionaria di secondi da 0 a 7. Questo viene fatto utilizzando il datetimeoffset(n) sintassi. Se non lo specifichi, utilizzerà 7 (l'impostazione predefinita). Ha anche un offset di fuso orario. La dimensione di archiviazione di questo tipo di dati è 8, 9 o 10 byte (più 1 byte per la precisione), a seconda della precisione utilizzata.

Il smalldatetime tipo di dati d'altra parte, non ha consapevolezza del fuso orario e, pertanto, non include alcun offset del fuso orario. Inoltre non ha secondi frazionari e la sua componente di secondi è sempre impostata su zero (:00). La sua precisione è al minuto più vicino. La dimensione di archiviazione di questo tipo di dati è fissata a 4 byte.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetimeoffset e smalldatetime .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thesmalldatetime smalldatetime;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thesmalldatetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thesmalldatetime AS 'smalldatetime';

Risultato:

+------------------------------------+---------------------+
| datetimeoffset                     | smalldatetime       |
|------------------------------------+---------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16: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 il datetimeoffset valore a un smalldatetime variabile.

Possiamo vedere che il smalldatetime variabile non ha una precisione frazionaria dei secondi e i suoi secondi sono stati impostati su zero. Inoltre, i minuti sono stati arrotondati per eccesso, poiché il valore originale aveva un valore di secondi pari a 30.

Un'altra osservazione è che l'offset del fuso orario è stato troncato:smalldatetime il tipo di dati non ha riconoscimento del fuso orario.

In questa conversione, la dimensione di archiviazione è diminuita da 10 byte (11 byte se si conteggia la precisione) per datetimeoffset , a 4 byte per smalldatetime .

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

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

Risultato:

+------------------------------------+-------------------------+
| datetimeoffset                     | smalldatetime           |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00     |
+------------------------------------+-------------------------+

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 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';

Risultato:

+------------------------------------+-------------------------+
| datetimeoffset                     | smalldatetime           |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00     |
+------------------------------------+-------------------------+