Este artigo contém exemplos de conversão de um datetime valor para um tempo valor no SQL Server.
Um dos benefícios de converter um datetime valor para tempo é que você reduz o tamanho do armazenamento de 8 bytes para 3, 4 ou 5 bytes (dependendo da precisão que você usa para o tempo valor). Estritamente falando, tempo usa 4, 5 ou 6 bytes, porque um byte extra é usado para armazenar sua precisão.
Ao converter um datetime valor para tempo , apenas a parte de hora do valor é copiada. O resultado exato dependerá da precisão de segundos fracionários que você atribuir ao tempo . Quando a hora a precisão é menor que o datetime precisão, os segundos fracionários são arredondados para caber no tempo precisão.
O datahora tipo de dados tem um máximo de 3 dígitos para sua parte de segundos fracionários. Sua precisão é arredondada para incrementos de 0,000, 0,003 ou 0,007 segundos.
A hora O tipo de dados, por outro lado, permite especificar 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, que fornece uma precisão de 100 nanossegundos.
Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre datetime e tempo .
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultado:
+-------------------------+------------------+ | datetime | time | |-------------------------+------------------| | 2025-05-21 10:15:30.123 | 10:15:30.1233333 | +-------------------------+------------------+
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 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.
Também podemos ver que o tempo variável tem mais precisão de segundos fracionários, e acabamos com uma parte fracionária de 1233333 (vs 123 para o datahora valor). Isso acontece porque o tempo value está usando a escala padrão de 7 (porque não especificamos explicitamente uma escala).
Exemplo 2 – Arredondamento
O datahora tipo de dados é arredondado para incrementos de 0,000, 0,003 ou 0,007 segundos. Mesmo que você o defina explicitamente para outro valor, ele será arredondado.
Aqui está um exemplo:
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'thetime';
Resultado:
+-------------------------+------------------+ | datetime | thetime | |-------------------------+------------------| | 2025-05-21 10:15:30.127 | 10:15:30.1266667 | +-------------------------+------------------+
Neste exemplo, defino os segundos fracionários para
125
mas datahora arredondado para
127
(porque só pode ser arredondado para incrementos de 0,000, 0,003 ou 0,007 segundos). A hora valor no entanto, defina os segundos fracionários para 1266667 .
Se simplesmente definissemos o valor inicial como tempo em primeiro lugar, sua parte fracionária teria retornado 1250000 .
Exemplo 3 – Precisão/Exatidão
Conforme mencionado, o tempo tipo de dados permite especificar a precisão de segundos fracionários. Se você não fizer isso, ele usa 7 (portanto, o exemplo anterior usa 7).
Você pode modificar isso usando o time(n ) sintaxe. Portanto, eu poderia ter usado tempo(7) para os exemplos anteriores para obter o mesmo resultado.
Neste exemplo, removo os segundos fracionários completamente usando time(0) :
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultado:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+----------+
Quando fazemos isso, o tamanho do armazenamento do tempo valor é reduzido para 3 bytes (4 bytes incluindo precisão) em oposição a 8 bytes para o datetime valor.
Esteja ciente de que usar uma precisão menor que o valor original fará com que o resultado seja arredondado para se ajustar à precisão especificada.
Exemplo:
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.525'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultado:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.527 | 10:15:31 | +-------------------------+----------+
Exemplo 4 – 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 tempo . DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS time(0)) AS 'time(0)';
Resultado:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+
Exemplo 5 – 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(time(0), @thedatetime) AS 'time(0)';
Resultado:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+