Este artigo contém exemplos de conversão de um smalldatetime valor para um tempo valor no SQL Server.
Quando você converte uma pequena data e hora valor para tempo , você perde a data. As horas, minutos e segundos são copiados. Os segundos fracionários são definidos como 0.
A pequena data e hora tipo de dados inclui a data e a hora. No entanto, o tempo 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. Seu tamanho de armazenamento é de 4 bytes.
A hora tipo de dados, por outro lado, inclui apenas a hora. No entanto, ele permite que você especifique uma precisão de segundos fracionários de 0 a 7. Isso é obtido usando o time(n ) sintaxe, onde n é a escala de 0 a 7. Se você não especificar isso, usará 7 (o padrão), que fornece uma precisão de 100 nanossegundos. Se você especificar zero (
0
), sua precisão será para o segundo mais próximo. Seu tamanho de armazenamento será de 3, 4 ou 5 bytes (mais 1 byte para armazenar a precisão), dependendo da precisão dos segundos fracionários. Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre 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';
Resultado:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 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 smalldatetime valor para um tempo variável.
A coisa mais óbvia sobre esse resultado é que o tempo valor não inclui a data. Isso é esperado, porque o tempo tipo de dados é apenas para armazenar valores de tempo, não valores de data.
O que não óbvio (pelo menos com o meu exemplo) é que o valor do tempo pode realmente lidar com uma parte de segundos fracionários. Meu sistema não exibe os segundos fracionários aqui, mas o próximo exemplo mostrará que ele de fato tem uma precisão de segundos fracionários de 7.
Além disso, se você observar com atenção, verá que o pequeno tempo de data value arredondou os minutos do valor real que eu estava tentando atribuir a ele. Isso reflete a precisão relativamente baixa do smalldatetime tipo de dados. Sua precisão é ao minuto mais próximo. A consequência óbvia disso é que, quando eventualmente reatribuímos seu valor ao tempo tipo de dados, é o valor arredondado que é atribuído – não o valor inicial que tentei atribuir. Se tivéssemos atribuído o valor inicial diretamente ao tempo variável, teríamos obtido um valor mais preciso (mesmo se tivéssemos especificado uma escala de 0).
Aqui está o que quero dizer:
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';
Resultado:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:15:30 | +---------------------+----------+
Exemplo 2 – Adição de segundos fracionários
A pequena data e hora tipo de dados não tem uma parte de segundos fracionários, mas em nosso primeiro exemplo, o tempo value tem uma precisão de segundos fracionários de 7 (mesmo que na verdade não exiba nenhuma casa decimal). Conheço sua precisão porque não especifiquei uma escala ao declará-la, portanto, usa sua escala padrão de 7.
Aqui está um exemplo para confirmar que a hora value pode, de fato, suportar uma parte fracionária:
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';
Resultado:
+---------------------+-----------------+------------------+ | smalldatetime | Original time | Modified time | |---------------------+-----------------+------------------| | 2025-05-21 10:16:00 | 10:16:00 | 10:16:00.1234567 | +---------------------+-----------------+------------------+
Observe que quando a hora valor tem uma escala de 7, tem um tamanho de armazenamento de 5 bytes. Portanto, ele tem requisitos de armazenamento mais altos do que o smalldatetime type (que usa apenas 4 bytes).
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 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)';
Resultado:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+
Neste exemplo, defino a escala para 0.
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.125'; SELECT @thesmalldatetime AS 'smalldatetime', CONVERT(time(0), @thesmalldatetime) AS 'time(0)';
Resultado:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+