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

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


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

O pequeno datetime tipo de dados 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.

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

Quando você converte uma pequena data e hora valor para datetime , o pequeno tempo de data o valor é copiado para o datetime valor. Os segundos fracionários são definidos como 0.

Na maioria dos casos, é melhor converter para um datetime2 tipo de dados em vez de um datetime . Fazer isso fornecerá maior precisão, usando o mesmo tamanho de armazenamento. No entanto, se você realmente precisar que seja datetime , aqui estão alguns exemplos.


Exemplo 1 – Conversão implícita


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

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

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

Neste exemplo, podemos ver que o smalldatetime value não inclui os segundos fracionários, os segundos foram definidos como zero e o minuto foi arredondado para cima do valor real que tentei atribuir a ele.

No entanto, o datetime value inclui uma parte fracionária de 3 dígitos definida como zero.

Exemplo 2 - Alterar a parte fracionária


Mesmo que a parte fracionária seja definida como zero, depois de converter o valor em datetime , agora você pode alterar a parte fracionária (e a parte dos segundos).

Neste exemplo, eu uso o DATEADD() função para modificar os segundos fracionários de datetime valor.
DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime datetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime AS 'datetime',
  DATEADD(millisecond, 123, @thedatetime) AS 'datetime Modified';

Resultado (usando saída vertical):
smalldatetime     | 2025-05-21 10:16:00
datetime          | 2025-05-21 10:16:00.000
datetime Modified | 2025-05-21 10:16:00.123

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 datahora .
DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CAST(@thesmalldatetime AS datetime) AS 'datetime';

Resultado:
+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.000 |
+---------------------+-------------------------+

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';
SELECT 
  @thesmalldatetime AS 'thesmalldatetime',
  CONVERT(datetime, @thesmalldatetime) AS 'datetime';

Resultado:
+---------------------+-------------------------+
| thesmalldatetime    | datetime                |
|---------------------+-------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.000 |
+---------------------+-------------------------+

Conforme mencionado, considere converter para um datetime2 tipo de dados em vez de datetime . Isso fornece maior precisão, usando o mesmo tamanho de armazenamento.