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

Converter 'smalldatetime' para 'time' no SQL Server (Exemplos de T-SQL)


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