Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Converter 'datetime2' em 'smalldatetime' no SQL Server (Exemplos de T-SQL)


Este artigo contém exemplos de conversão de um datetime2 valor para um smalldatetime valor no SQL Server.

Um dos benefícios de converter um datetime2 valor para smalldatetime é que você reduz o tamanho do armazenamento de 7, 8 ou 9 bytes para 4 bytes. No entanto, você perde a precisão.



O datetime2 tipo de dados permite que você especifique uma precisão de segundos fracionários de 0 a 7. Se você não especificar isso, ele usará 7 (o padrão). Se você especificar zero (0 ), sua precisão será para o segundo mais próximo.

A pequena data e hora O tipo de dados, por outro lado, não possui segundos fracionários e seu componente de segundos é sempre definido como zero (:00). Sua precisão é para o minuto mais próximo.

Ao converter um datetime2 valor para smalldatetime , a data e parte da hora são copiadas. O componente de segundos é definido como zero (independentemente do valor original do componente de segundos) e o tempo é arredondado para o minuto mais próximo. Quaisquer segundos fracionários são removidos.

Exemplo 1 – Conversão implícita


Aqui está um exemplo de uma conversão implícita entre datetime2 e pequena data e hora .
DECLARE @thedatetime2 datetime2, @thesmalldatetime smalldatetime;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thesmalldatetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thesmalldatetime AS 'smalldatetime';

Resultado:
+-----------------------------+---------------- -----+| datahora2 | smalldatetime ||-----------------------------+----------------- ----|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:16:00 |+-----------------------------+-------- -------------+

Esta é uma conversão implícita porque não estamos usando uma função de conversão (como as abaixo) para convertê-la explicitamente. Nesse caso, o SQL Server executa uma conversão implícita nos bastidores quando tentamos atribuir o datetime2 valor para um smalldatetime variável.

Neste exemplo, podemos ver que o smalldatetime O valor não inclui os segundos fracionários, os segundos foram definidos como zero e o minuto foi arredondado para cima.

Nesse caso, o datetime2 value usa uma precisão de 7. Isso ocorre porque 7 é o valor padrão. Eu não especifiquei uma precisão e, portanto, o valor padrão foi usado.

Mas teria retornado o mesmo resultado, independentemente da precisão que eu escolhi. Mesmo se eu tivesse reduzido para zero (ou seja, declarado como datetime2(0) ), ele ainda teria retornado o mesmo resultado.

Exemplo 2 – Conversão explícita usando CAST()


Aqui está um exemplo de uma conversão explícita. Neste caso, eu uso o CAST() função diretamente dentro do SELECT instrução para converter explicitamente entre datetime2 e pequena data e hora .
DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS smalldatetime) AS 'smalldatetime'; 
Resultado:
+---------------------+----------+| datahora2 | smalldatetime ||---------------------+---------------------|| 2025-05-21 10:15:30 | 21/05/2025 10:16:00 |+--------------------------------+---------------- -----+

Neste exemplo, decidi usar uma escala de zero para o datetime2 valor (ou seja, datetime2(0) ), no entanto, isso não afeta o smalldatetime resultante valor.

Exemplo 3 – Conversão explícita usando CONVERT()


Aqui está um exemplo de uma conversão explícita usando o CONVERT() função em vez de CAST() .
DECLARE @thedatetime2 datetime2(0);SET @thedatetime2 ='2025-05-21 10:15:30';SELECT @thedatetime2 AS 'datetime2', CONVERT(smalldatetime, @thedatetime2) AS 'smalldatetime'; 
Resultado:
+---------------------+----------+| datahora2 | smalldatetime ||---------------------+---------------------|| 2025-05-21 10:15:30 | 21/05/2025 10:16:00 |+--------------------------------+---------------- -----+