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

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


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

Um dos benefícios de converter um datetime2 valor para tempo é que você reduz o tamanho do armazenamento entre 6 e 8 bytes, para entre 3 e 5 bytes (dependendo da precisão que cada tipo de dados atribuiu a ele). Estritamente falando, 1 byte extra é usado para armazenar a precisão desses tipos de dados, portanto, você deve adicionar 1 byte a esses valores.

Obviamente, você perde a parte da data durante a conversão, mas não faria essa conversão se precisasse reter a parte da data.



Ao converter um datetime2 valor para tempo , apenas a parte de hora do valor é copiada. O resultado exato dependerá da precisão dos segundos fracionários atribuídos a cada tipo. Quando a hora a precisão é menor que o datetime2 precisão, os segundos fracionários são arredondados para caber no tempo precisão.

Em relação à precisão, ambos os tipos de dados permitem especificar uma escala de 0 casas decimais até 7. Portanto, você tem a capacidade de realizar a conversão sem perder nenhum segundo fracionário ou ter o resultado arredondado.

Exemplo 1 – Conversão implícita


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

Resultado:
+-----------------------------+---------------- --+| datahora2 | tempo ||-----------------------------+----------------- -|| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |+-----------------------------+------------- -----+

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 tempo variável.

A coisa mais aparente sobre este 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.

Além disso, neste exemplo, ambos os tipos de dados usam sua precisão padrão (que é uma escala de 7). Isso significa que o tempo o valor termina com a mesma precisão que o datetime2 valor. A razão pela qual eu sei que eles usam sua precisão padrão é porque eu não especifiquei uma escala fracionária de segundo ao declará-los.

Exemplo 2 – Converter para uma precisão mais alta


Neste exemplo, a hora variável usa maior precisão para o datetime2 variável.
DECLARE @thedatetime2 datetime2(4), @thetime time(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'hora';

Resultado:
+--------------------------+------------------+ | datahora2 | tempo ||--------------------------+------------------|| 21-05-2025 10:15:30.1235 | 10:15:30.1235000 |+-------------------------------------+---------------- --+

Nesse caso, o datetime2 variável usa uma escala de 4 e o tempo variável usa 7.

Isso resulta em datetime2 arredondando para cima os segundos fracionários, então temos 1235 em vez de 1234 . Isso também significa que quando convertemos para hora , o valor termina com 3 zeros à direita (porque especificamos uma escala de 7). Isso também significa que o tempo O tamanho de armazenamento do valor é de 5 bytes (6 incluindo precisão) comparado a 4 bytes (5 incluindo precisão) se dermos uma escala de 4.

Exemplo 3 – Converter para uma precisão mais baixa


Neste exemplo, a hora variável usa menor precisão para o datetime2 variável.
DECLARE @thedatetime2 datetime2(7), @thetime time(0);SET @thedatetime2 ='2025-05-21 10:15:30.5678912';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'hora';

Resultado:
+-----------------------------+----------+| datahora2 | tempo ||-----------------------------+----------|| 2025-05-21 10:15:30.5678912 | 10:15:31 |+-----------------------------+----------+ 
Então, neste caso, tempo A escala de 's é reduzida para 0, o que significa que nenhum segundo fracionário é incluído no resultado. Além disso, os segundos são arredondados de acordo.

A hora value usa 4 bytes de armazenamento (incluindo precisão), em comparação com 9 bytes para o datetime2 valor (e comparado a 6 bytes para o tempo valor no exemplo anterior).

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 datetime2 e tempo .
DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS time(0)) AS 'time( 0)';

Resultado:
+-------------------------+-----------+| datahora2 | time(0) ||-------------------------+-----------|| 21-05-2025 10:15:30.123 | 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 @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CONVERT(time(0), @thedatetime2) AS 'time( 0)';

Resultado:
+-------------------------+-----------+| datahora2 | time(0) ||-------------------------+-----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+-------------------------+-----------+