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

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

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

Quando converti un smalldatetime valore in tempo , perdi la data. Vengono copiati ore, minuti e secondi. I secondi frazionari sono impostati su 0.

Il smalldatetime il tipo di dati include sia la data che l'ora. Tuttavia, il tempo non ha secondi frazionari e la sua componente di secondi è sempre impostata su zero (:00). La sua precisione è al minuto più vicino. La sua dimensione di archiviazione è di 4 byte.

Il tempo tipo di dati d'altra parte, include solo l'ora. Tuttavia, ti 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 (impostazione predefinita), che fornisce una precisione di 100 nanosecondi. Se specifichi zero (0 ), la sua precisione sarà al secondo più vicino. La sua dimensione di archiviazione sarà di 3, 4 o 5 byte (più 1 byte per memorizzare la precisione), a seconda della precisione dei secondi frazionari.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra datetime e tempo .

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Risultato:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 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 smalldatetime 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.

Cosa non ovvio (almeno con il mio esempio) è che il valore del tempo può effettivamente gestire una parte di secondi frazionari. Il mio sistema non mostra i secondi frazionari qui, ma il prossimo esempio mostrerà che in realtà ha una precisione di secondi frazionari di 7.

Inoltre, se guardi da vicino, vedrai che il smalldatetime value ha arrotondato per eccesso i minuti dal valore effettivo che stavo cercando di assegnargli. Ciò riflette la precisione relativamente bassa di smalldatetime tipo di dati. La sua precisione è al minuto più vicino. L'ovvia conseguenza di ciò è che quando alla fine ne riassegnamo il valore al tempo tipo di dati, è il valore arrotondato per eccesso assegnato, non il valore iniziale che ho provato ad assegnare. Se avessimo assegnato il valore iniziale direttamente al tempo variabile, avremmo ottenuto un valore più preciso (anche se avessimo specificato una scala pari a 0).

Ecco cosa intendo:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Risultato:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Esempio 2 – Aggiunta di secondi frazionari

Il smalldatetime il tipo di dati non ha una parte di secondi frazionari, ma nel nostro primo esempio, il tempo value ha una precisione frazionaria di secondi pari a 7 (anche se in realtà non visualizza alcuna cifra decimale). Conosco la sua precisione perché non ho specificato una scala quando la dichiaro, quindi usa la sua scala predefinita di 7.

Ecco un esempio per confermare che il tempo il valore può infatti supportare una parte frazionaria:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Risultato:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Nota che quando è il tempo value ha una scala di 7, ha una dimensione di archiviazione di 5 byte. Pertanto, ha requisiti di archiviazione più elevati rispetto a smalldatetime type (che utilizza solo 4 byte).

Esempio 3 – 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 smalldatetime e tempo .

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

Risultato:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

In questo esempio ho impostato la scala su 0.

Esempio 4 – Conversione esplicita mediante CONVERT()

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

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

Risultato:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+