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

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


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

Ao converter um offset de data e hora valor para datetime , os valores de data e hora são copiados e o deslocamento de fuso horário é truncado. Quando a precisão fracionária do datetimeoffset valor for maior que três dígitos, o valor será truncado.



O deslocamento de data e hora tipo de dados permite que você especifique uma precisão de segundos fracionários de 0 a 7. Isso é feito usando o datetimeoffset(n) sintaxe. Se você não especificar isso, ele usará 7 (o padrão). Ele também tem um deslocamento de fuso horário. O tamanho de armazenamento desse tipo de dados é de 8, 9 ou 10 bytes, dependendo da precisão que está sendo usada. Outro byte é usado para armazenar a precisão, então isso adiciona 1 byte a esses números.

O datahora O tipo de dado, por outro lado, tem no máximo 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. Esse tipo de dados não tem reconhecimento de fuso horário e, portanto, nenhum deslocamento de fuso horário. Seu tamanho de armazenamento é de 8 bytes.

Exemplo 1 – Conversão implícita


Aqui está um exemplo de uma conversão implícita entre datetimeoffset e datahora .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datahora';

Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | datahora ||------------------------------------+---------- ---------------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+---------------------------------------------------+- ------------------------+

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 datetimeoffset valor para um datetime variável.

Podemos ver que o datetime variável tem menos precisão de segundos fracionários, e acabamos com uma parte fracionária de 123 mesmo que a parte fracionária original fosse 1234567 .

Neste caso, nenhum arredondamento foi realizado.

Também vemos que o deslocamento do fuso horário foi truncado. O datahora tipo de dados não tem reconhecimento de fuso horário.

Nesta conversão, o tamanho do armazenamento diminuiu de 10 bytes (11 bytes se você incluir o byte extra que armazena a precisão) para datetimeoffset , para 8 bytes para datetime . No entanto, se o deslocamento de data e hora value tivesse usado uma escala entre 0 e 2, teria usado apenas 8 bytes (9 incluindo precisão).

Se tivesse usado uma escala de 3 (o equivalente a datetime valor), o tamanho do armazenamento teria sido de 9 bytes (10 com precisão). No entanto, sua precisão teria sido maior que datetime . Obviamente, a precisão diminuiria assim que a convertíssemos para datetime .

Exemplo 2 – Precisão/exatidão e 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.

Isso também se aplica ao converter de outro tipo de dados (como o que estamos fazendo aqui).

Aqui está um exemplo que demonstra o que quero dizer.
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datahora';

Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | datahora ||------------------------------------+---------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 21/05/2025 10:15:30.127 |+---------------------------------------------------+- ------------------------+

Neste exemplo, defini os segundos fracionários do datetimeoffset valor para 1250000 mas datahora arredondado para 127 (porque só pode ser arredondado para incrementos de 0,000, 0,003 ou 0,007 segundos).

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 datetimeoffset e datahora .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) AS 'datetime'; 
Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | datahora ||------------------------------------+---------- ---------------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+---------------------------------------------------+- ------------------------+

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 @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset) AS 'datetime'; 
Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | datahora ||------------------------------------+---------- ---------------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+---------------------------------------------------+- ------------------------+