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 oCONVERT()
função em vez deCAST()
.
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 |+---------------------------------------------------+- ------------------------+