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

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

Questo articolo contiene esempi di conversione di una data/ora valore a un tempo valore in SQL Server.

Uno dei vantaggi della conversione di un datetime valore in tempo è che riduci la dimensione di archiviazione da 8 byte, fino a 3, 4 o 5 byte (a seconda della precisione che utilizzi per il tempo valore). A rigor di termini, tempo utilizza 4, 5 o 6 byte, perché viene utilizzato un byte in più per memorizzarne la precisione.

Quando converti un data/ora valore in tempo , viene copiata solo la parte temporale del valore. Il risultato esatto dipenderà dalla precisione frazionaria di secondi che assegni al tempo . Quando il tempo la precisione è inferiore a datetime precisione, i secondi frazionari vengono arrotondati per adattarsi al tempo precisione.

La data e ora il tipo di dati ha un massimo di 3 cifre per la sua parte di secondi frazionari. La sua precisione è arrotondata a incrementi di .000, .003 o .007 secondi.

Il tempo il tipo di dati, d'altra parte, consente di specificare una precisione frazionaria di secondi da 0 a 7. Ciò si ottiene utilizzando il time(n ) sintassi, dove n è la scala da 0 a 7. Se non lo specifichi, utilizzerà 7, che fornisce una precisione di 100 nanosecondi.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetime e tempo .

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Risultato:

+-------------------------+------------------+
| datetime                | time             |
|-------------------------+------------------|
| 2025-05-21 10:15:30.123 | 10:15:30.1233333 |
+-------------------------+------------------+

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

La cosa più ovvia 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.

Possiamo anche vedere che il tempo variabile ha una precisione di secondi frazionari maggiore e ci ritroviamo con una parte frazionaria di 1233333 (rispetto a 123 per la data e ora valore). Questo accade perché il tempo value sta usando la scala predefinita di 7 (perché non abbiamo specificato esplicitamente una scala).

Esempio 2 – Arrotondamento

La data e ora il tipo di dati viene arrotondato per incrementi di .000, .003 o .007 secondi. Anche se lo imposti in modo esplicito su un altro valore, verrà arrotondato.

Ecco un esempio:

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'thetime';

Risultato:

+-------------------------+------------------+
| datetime                | thetime          |
|-------------------------+------------------|
| 2025-05-21 10:15:30.127 | 10:15:30.1266667 |
+-------------------------+------------------+

In questo esempio, ho impostato i secondi frazionari su 125 ma data e ora arrotondato per eccesso a 127 (perché può essere arrotondato solo per incrementi di .000, .003 o .007 secondi).

Il tempo valore, tuttavia, imposta i secondi frazionari su 1266667 .

Se dovessimo semplicemente impostare il valore iniziale su tempo in primo luogo, la sua parte frazionaria avrebbe restituito 1250000 .

Esempio 3 – Precisione/Precisione

Come accennato, il tempo il tipo di dati consente di specificare la precisione dei secondi frazionari. Se non lo fai, usa 7 (quindi, l'esempio precedente usa 7).

Puoi modificarlo utilizzando time(n ) sintassi. Pertanto, avrei potuto utilizzare tempo(7) per gli esempi precedenti per ottenere lo stesso risultato.

In questo esempio, rimuovo del tutto i secondi frazionari utilizzando time(0) :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Risultato:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.127 | 10:15:30 |
+-------------------------+----------+

Quando lo facciamo, la dimensione di archiviazione del tempo il valore viene ridotto a 3 byte (4 byte inclusa la precisione) rispetto a 8 byte per il datetime valore.

Tieni presente che l'utilizzo di una precisione inferiore rispetto al valore originale farà sì che il risultato venga arrotondato per eccesso per adattarsi alla precisione specificata.

Esempio:

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.525';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Risultato:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.527 | 10:15:31 |
+-------------------------+----------+

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 datetime e tempo .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS time(0)) AS 'time(0)';

Risultato:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+

Esempio 5 – Conversione esplicita mediante CONVERT()

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

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(time(0), @thedatetime) AS 'time(0)';

Risultato:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+