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

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

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

Uno dei vantaggi della conversione di un datetime2 valore in tempo è che si riduce la dimensione di archiviazione da 6 a 8 byte, fino a un valore compreso tra 3 e 5 byte (a seconda della precisione assegnata a ciascun tipo di dati). A rigor di termini, viene utilizzato 1 byte in più per memorizzare la precisione per questi tipi di dati, quindi dovresti aggiungere 1 byte a questi importi.

Ovviamente, perdi la parte della data durante la conversione, ma non faresti questa conversione se dovessi conservare la parte della data.

Quando converti un datetime2 valore in tempo , viene copiata solo la parte temporale del valore. Il risultato esatto dipenderà dalla precisione frazionaria di secondi assegnata a ciascun tipo. Quando il tempo la precisione è inferiore a datetime2 precisione, i secondi frazionari vengono arrotondati per adattarsi al tempo precisione.

Per quanto riguarda la precisione, entrambi i tipi di dati consentono di specificare una scala da 0 decimali fino a 7. Pertanto, hai la possibilità di eseguire la conversione senza perdere una frazione di secondo o arrotondare il risultato per eccesso.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetime2 e tempo .

DECLARE 
  @thedatetime2 datetime2, 
  @thetime time;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Risultato:

+-----------------------------+------------------+
| datetime2                   | time             |
|-----------------------------+------------------|
| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |
+-----------------------------+------------------+

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 datetime2 valore a un tempo variabile.

La cosa più evidente di questo risultato è che il tempo il valore non include la data. Questo è prevedibile, perché il tempo il tipo di dati serve esclusivamente per memorizzare i valori temporali, non i valori di data.

Inoltre, in questo esempio, entrambi i tipi di dati utilizzano la loro precisione predefinita (che è una scala di 7). Ciò significa che il tempo il valore finisce con la stessa precisione di datetime2 valore. Il motivo per cui so che usano la loro precisione predefinita è perché non ho specificato una scala di secondi frazionari quando li ho dichiarati.

Esempio 2:conversione a una precisione maggiore

In questo esempio il tempo utilizza una precisione maggiore per datetime2 variabile.

DECLARE 
  @thedatetime2 datetime2(4), 
  @thetime time(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Risultato:

+--------------------------+------------------+
| datetime2                | time             |
|--------------------------+------------------|
| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |
+--------------------------+------------------+

In questo caso il datetime2 variabile utilizza una scala di 4 e il tempo la variabile usa 7.

Ciò si traduce in datetime2 arrotondando per eccesso i secondi frazionari, otteniamo 1235 invece di 1234 . Significa anche che quando lo convertiamo in tempo , il valore finisce con 3 zeri finali (perché abbiamo specificato una scala di 7). Ciò significa anche che il tempo la dimensione di archiviazione del valore è 5 byte (6 inclusa la precisione) rispetto a 4 byte (5 inclusa la precisione) se gli avessimo assegnato una scala di 4.

Esempio 3:conversione a una precisione inferiore

In questo esempio il tempo la variabile utilizza una precisione inferiore a datetime2 variabile.

DECLARE 
  @thedatetime2 datetime2(7), 
  @thetime time(0);
SET @thedatetime2 = '2025-05-21 10:15:30.5678912';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Risultato:

+-----------------------------+----------+
| datetime2                   | time     |
|-----------------------------+----------|
| 2025-05-21 10:15:30.5678912 | 10:15:31 |
+-----------------------------+----------+

Quindi in questo caso tempo La scala di 's viene ridotta a 0, il che significa che nel risultato non sono inclusi secondi frazionari. Inoltre, i secondi vengono arrotondati di conseguenza.

Il tempo il valore utilizza 4 byte di archiviazione (inclusa la precisione), rispetto ai 9 byte per datetime2 valore (e rispetto a 6 byte per il tempo valore nell'esempio precedente).

Esempio 4 – 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 in modo esplicito tra datetime2 e tempo .

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS time(0)) AS 'time(0)';

Risultato:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

Esempio 5 – Conversione esplicita mediante CONVERT()

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

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(time(0), @thedatetime2) AS 'time(0)';

Risultato:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+