Este artigo contém exemplos de conversão de um smalldatetime valor para um datetime2 valor no SQL Server.
A pequena data e hora tipo de dados 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.
O datetime2 por outro lado, permite especificar uma precisão de segundos fracionários de 0 a 7. Se você não especificar isso, usará 7 (o padrão). Se você especificar zero (
0
), sua precisão será para o segundo mais próximo. Quando você converte uma pequena data e hora valor para datetime2 , as horas e os minutos são copiados. Os segundos e segundos fracionários são definidos como 0.
Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre smalldatetime e datetime2 .
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Resultado:
+---------------------+-----------------------------+ | smalldatetime | datetime2 | |---------------------+-----------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 | +---------------------+-----------------------------+
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 smalldatetime valor para um datetime2 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. Isso resulta em 7 zeros sendo usados na parte fracionária.
Exemplo 2 – Remover a parte fracionária
Você pode remover os segundos fracionários, se necessário. Para fazer isso, basta usar
datetime2(0)
ao declarar a variável. DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetime2 AS 'datetime2';
Resultado:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Portanto, neste caso, ambos os tipos de dados retornam o mesmo valor. No entanto, a diferença é que o datetime2 tem a capacidade de fornecer precisão ao segundo (em comparação com smalldatetime precisão de minuto).
Exemplo:
DECLARE @thesmalldatetime smalldatetime, @thedatetime2 datetime2(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetime2 = @thesmalldatetime; SELECT DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime', DATEADD(second, 30, @thedatetime2) AS 'datetime2';
Resultado:
+---------------------+---------------------+ | smalldatetime | datetime2 | |---------------------+---------------------| | 2025-05-21 10:17:00 | 2025-05-21 10:16:30 | +---------------------+---------------------+
Neste exemplo eu usei o
DATEADD()
função para adicionar 30 segundos a cada valor. No entanto, cada tipo de dados retorna um resultado diferente. O datetime2 tipo de dados respeita a parte dos segundos e fornece o resultado correto com 100% de precisão. A pequena data e hora por outro lado, é arredondado para o minuto mais próximo (enquanto a parte dos segundos permanece em zero). Exemplo 3 – 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
para converter explicitamente entre smalldatetime e datetime2 . DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CAST(@thesmalldatetime AS datetime2(0)) AS 'datetime2(0)';
Resultado:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+
Exemplo 4 – 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 @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'thesmalldatetime', CONVERT(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';
Resultado:
+---------------------+---------------------+ | thesmalldatetime | datetime2(0) | |---------------------+---------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 | +---------------------+---------------------+