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

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


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

Ao converter um offset de data e hora valor para datetime2 , a data e a hora são copiadas para o datetime2 valor e o fuso horário é truncado. Os segundos fracionários também são truncados para caber se a precisão do destino for menor.



O deslocamento de data e hora tipo de dados permite que você especifique uma precisão de segundos fracionários de 0 a 7 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.

O datetime2 tipo de dados também permite que você especifique uma precisão de segundos fracionários de 0 a 7 (usando o datetime2(n) sintaxe). Não tem consciência de fuso horário. Seu tamanho de armazenamento é 6, 7 ou 8, dependendo da precisão que está sendo usada.

Observe que os valores de armazenamento listados aqui são os valores listados na documentação da Microsoft. No entanto, esses tipos de dados também usam 1 byte para armazenar a precisão. Portanto, adicione 1 byte às quantidades listadas aqui para obter uma visão mais completa dos requisitos de armazenamento.

Exemplo 1 – Conversão implícita


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

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

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

Neste exemplo, ambos os tipos de dados usam a precisão padrão (7 casas decimais). Portanto, a parte fracionária era 1234567 para ambos os resultados.

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

Nesta conversão, o tamanho do armazenamento diminuiu de 10 bytes (para datetimeoffset ) para 8 bytes (para datetime2 ), embora observe que 1 byte é adicionado para armazenar a precisão.

Exemplo 2 – Precisão diferente


Aqui está um exemplo que demonstra o que acontece se o datetime2 value usa uma precisão menor para o datetimeoffset valor.
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

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

Neste exemplo, o offset de data e hora tem uma escala de 7 mas o datetime2 valor tem uma escala de apenas 3 . Portanto, os segundos fracionários foram truncados para caber.

Observe que isso pode causar arredondamento. Aqui está um exemplo em que a parte fracionária do datetime2 o valor é arredondado para 124 .
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

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

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

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(datetime2, @thedatetimeoffset) AS 'datetime2'; 
Resultado:
+------------------------------------+--------- --------------------+| deslocamento de data e hora | datetime2 ||------------------------------------+---------- --------------------|| 21-05-2025 10:15:30.1234567 +07:00 | 21-05-2025 10:15:30.1234567 |+---------------------------------------------------+- ----------------------------+