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

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


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  |
+-------------------------+-----------+