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

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


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

Ao converter um datetime valor para datetime2 , o valor resultante dependerá da precisão de segundos fracionários que você atribui a datetime2 .

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.

O datetime2 O tipo de dados, 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).


Exemplo 1 – Conversão implícita


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

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

Podemos ver que o datetime2 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).

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. Como você pode esperar, isso pode causar muita confusão se você não estiver ciente de como funciona. Não só pode causar confusão ao usar datetime por si só, pode causar confusão extra ao converter esse valor para outro tipo de dados.

Aqui está um exemplo que demonstra o que quero dizer.
DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:
+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 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).

O datetime2 valor no entanto, defina os segundos fracionários para 1266667 .

A propósito, se simplesmente definissemos o valor inicial como datetime2 em primeiro lugar, sua parte fracionária teria retornado 1250000 .

Exemplo 3 – Precisão/Exatidão


Um dos benefícios de datetime2 é que permite especificar a precisão dos segundos fracionários. Se você não fizer isso, ele usa 7 (portanto, o exemplo anterior usa 7).

Portanto, podemos modificar o exemplo anterior para que o datetime2 value usa a mesma precisão de segundos fracionários que o datetime tipo de dados.
DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(3);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:
+-------------------------+-------------------------+
| datetime                | datetime2               |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Quando fazemos isso, o datetime2 value retorna o mesmo resultado que datetime valor. Ele também usa a mesma quantidade de armazenamento (8 bytes). Nesse caso, datetime2 usa 7 bytes para armazenar o valor e 1 byte para armazenar a precisão do valor.

Você pode até especificar menos precisão de segundos fracionários do que datetime se você não precisar da precisão extra. Isso economizará um byte inteiro de espaço de armazenamento (seu datetime2 valor usará 7 bytes, em comparação com 8 bytes para o datetime valor).
DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(2);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Resultado:
+-------------------------+------------------------+
| datetime                | datetime2              |
|-------------------------+------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 |
+-------------------------+------------------------+

Tenha em mente que isso também pode resultar em segundos fracionários sendo arredondados.

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 datetime2 .
DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetime2(3)) AS 'datetime2(3)';

Resultado:
+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

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(datetime2(3), thedatetime) AS 'datetime2(3)';

Resultado:
+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Recomendação da Microsoft


A Microsoft recomenda o uso de conversão explícita sempre que existir um cenário de comparação mista entre esses dois tipos de dados:

No nível de compatibilidade de banco de dados 130, conversões implícitas de datetime para datetime2 os tipos de dados mostram precisão aprimorada considerando os milissegundos fracionários, resultando em diferentes valores convertidos… Use a conversão explícita para datetime2 tipo de dados sempre que um cenário de comparação misto entre datetime e datetime2 tipos de dados existe.