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

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


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

A pequena data e hora 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 datetime2 por outro lado, permite especificar uma precisão de segundos fracionários de 0 a 7. Se você não especificar isso, usará 7 (o padrão). Se você especificar zero (0 ), sua precisão será para o segundo mais próximo.

Quando você converte uma pequena data e hora valor para datetime2 , as horas e os minutos são copiados. Os segundos e segundos fracionários são definidos como 0.


Exemplo 1 – Conversão implícita


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

Resultado:
+---------------------+-----------------------------+
| smalldatetime       | datetime2                   |
|---------------------+-----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 |
+---------------------+-----------------------------+

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 datetime2 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 para cima.

Nesse caso, o datetime2 value usa uma precisão de 7. Isso ocorre porque 7 é o valor padrão. Eu não especifiquei uma precisão e, portanto, o valor padrão foi usado. Isso resulta em 7 zeros sendo usados ​​na parte fracionária.

Exemplo 2 – Remover a parte fracionária


Você pode remover os segundos fracionários, se necessário. Para fazer isso, basta usar datetime2(0) ao declarar a variável.
DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetime2 AS 'datetime2';

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

Portanto, neste caso, ambos os tipos de dados retornam o mesmo valor. No entanto, a diferença é que o datetime2 tem a capacidade de fornecer precisão ao segundo (em comparação com smalldatetime precisão de minuto).

Exemplo:
DECLARE 
  @thesmalldatetime smalldatetime,
  @thedatetime2 datetime2(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetime2 = @thesmalldatetime;
SELECT 
  DATEADD(second, 30, @thesmalldatetime) AS 'smalldatetime',
  DATEADD(second, 30, @thedatetime2) AS 'datetime2';

Resultado:
+---------------------+---------------------+
| smalldatetime       | datetime2           |
|---------------------+---------------------|
| 2025-05-21 10:17:00 | 2025-05-21 10:16:30 |
+---------------------+---------------------+

Neste exemplo eu usei o DATEADD() função para adicionar 30 segundos a cada valor. No entanto, cada tipo de dados retorna um resultado diferente. O datetime2 tipo de dados respeita a parte dos segundos e fornece o resultado correto com 100% de precisão. A pequena data e hora por outro lado, é arredondado para o minuto mais próximo (enquanto a parte dos segundos permanece em zero).

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

Resultado:
+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+

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(datetime2(0), @thesmalldatetime) AS 'datetime2(0)';

Resultado:
+---------------------+---------------------+
| thesmalldatetime    | datetime2(0)        |
|---------------------+---------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 |
+---------------------+---------------------+