Este artigo contém exemplos de conversão de um datetime valor para um smalldatetime valor no SQL Server.
Um dos benefícios de converter um datetime valor para smalldatetime é que você reduz o tamanho do armazenamento de 8 bytes para 4 bytes. No entanto, você perde a precisão ao fazê-lo.
O datahora tipo de dados inclui uma parte de segundos fracionários de 3 dígitos. Sua precisão é arredondada para incrementos de 0,000, 0,003 ou 0,007 segundos.
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). Além disso, ele só tem uma precisão para o minuto mais próximo.
Ao converter um datetime valor para smalldatetime , a data e parte da hora são copiadas. O componente de segundos é definido como zero (independentemente do valor original) 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 datetime e pequena data e hora .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultado:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.123 | 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 datetime 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.
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 datetime e pequena data e hora . DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS smalldatetime) AS 'smalldatetime';
Resultado:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Você deve ter notado que neste exemplo eu alterei os segundos fracionários ao atribuir o valor inicial a
@thedatetime
. Mas porque estou atribuindo-o a um datetime tipo de dados, a parte dos segundos fracionários é arredondada para cima (porque sua precisão é arredondada para incrementos de 0,000, 0,003 ou 0,007 segundos). Neste caso, tento atribuir um segundo fracionário de 125
mas é arredondado para 127
. No entanto, isso não afeta o smalldatetime 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 @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(smalldatetime, @thedatetime) AS 'smalldatetime';
Resultado:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 | +-------------------------+---------------------+