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

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


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

Um dos benefícios de converter um datetime valor para smalldatetime é que você reduz o tamanho do armazenamento de 8 bytes para 4 bytes. No entanto, você perde a precisão ao fazê-lo.



O datahora tipo de dados inclui uma parte de segundos fracionários de 3 dígitos. Sua precisão é arredondada para incrementos de 0,000, 0,003 ou 0,007 segundos.

A pequena data e hora O tipo de dados, por outro lado, não possui segundos fracionários e seu componente de segundos é sempre definido como zero (:00). Além disso, ele só tem uma precisão para o minuto mais próximo.

Ao converter um datetime valor para smalldatetime , a data e parte da hora são copiadas. O componente de segundos é definido como zero (independentemente do valor original) e o tempo é arredondado para o minuto mais próximo. Quaisquer segundos fracionários são removidos.

Exemplo 1 – Conversão implícita


Aqui está um exemplo de uma conversão implícita entre datetime e pequena data e hora .
DECLARE 
  @thedatetime datetime, 
  @thesmalldatetime smalldatetime;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thesmalldatetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thesmalldatetime AS 'smalldatetime';

Resultado:
+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 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 datetime valor para um smalldatetime variável.

Neste exemplo, podemos ver que o smalldatetime O valor não inclui os segundos fracionários, os segundos foram definidos como zero e o minuto foi arredondado.

Exemplo 2 – 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 pequena data e hora .
DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS smalldatetime) AS 'smalldatetime';

Resultado:
+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Você deve ter notado que neste exemplo eu alterei os segundos fracionários ao atribuir o valor inicial a @thedatetime . Mas porque estou atribuindo-o a um datetime tipo de dados, a parte dos segundos fracionários é arredondada para cima (porque sua precisão é arredondada para incrementos de 0,000, 0,003 ou 0,007 segundos). Neste caso, tento atribuir um segundo fracionário de 125 mas é arredondado para 127 .

No entanto, isso não afeta o smalldatetime valor.

Exemplo 3 – 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(smalldatetime, @thedatetime) AS 'smalldatetime';

Resultado:
+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+