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

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

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

Il smalldatetime il tipo di dati non ha secondi frazionari e il relativo componente secondi è sempre impostato su zero (:00). La sua precisione è al minuto più vicino.

La data e ora tipo di dati, d'altra parte, include una parte di secondi frazionari di 3 cifre e la sua precisione è arrotondata a incrementi di .000, .003 o .007 secondi.

Quando converti un smalldatetime valore a datetime , il smalldatetime il valore viene copiato in datetime valore. I secondi frazionari sono impostati su 0.

Nella maggior parte dei casi, faresti meglio a convertire in un datetime2 tipo di dati invece di un datetime . In questo modo si fornirà una maggiore precisione, pur utilizzando la stessa dimensione di archiviazione. Tuttavia, se hai davvero bisogno che sia datetime , ecco alcuni esempi.

Esempio 1 – Conversione implicita

Ecco un esempio di conversione implicita tra smalldatetime e data e ora .

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

Risultato:

+---------------------+-------------------------+
| smalldatetime       | datetime                |
|---------------------+-------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.000 |
+---------------------+-------------------------+

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 datetime variabile.

In questo esempio possiamo vedere che smalldatetime value non include i secondi frazionari, i secondi sono stati impostati a zero e il minuto è stato arrotondato per eccesso rispetto al valore effettivo che ho provato ad assegnargli.

Tuttavia, il data/ora il valore include una parte frazionaria a 3 cifre impostata su zero.

Esempio 2 – Modifica della parte frazionaria

Anche se la parte frazionaria è impostata su zero, una volta convertito il valore in datetime , ora puoi cambiare la parte frazionaria (e anche la parte dei secondi).

In questo esempio, utilizzo DATEADD() funzione per modificare i secondi frazionari di datetime valore.

DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime datetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime AS 'datetime',
  DATEADD(millisecond, 123, @thedatetime) AS 'datetime Modified';

Risultato (usando l'output verticale):

smalldatetime     | 2025-05-21 10:16:00
datetime          | 2025-05-21 10:16:00.000
datetime Modified | 2025-05-21 10:16:00.123

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 data e ora .

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

Risultato:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.000 |
+---------------------+-------------------------+

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';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime, @thesmalldatetime) AS 'datetime';

Risultato:

+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.000 |
+---------------------+-------------------------+

Come accennato, prendi in considerazione la conversione a un datetime2 tipo di dati invece di datetime . In questo modo si ottiene una maggiore precisione, pur utilizzando la stessa dimensione di archiviazione.