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

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


Se você tiver um deslocamento de data e hora valor, mas você não precisa da parte de deslocamento de fuso horário e horário, convertendo-o em data economizará muito espaço de armazenamento (ao remover detalhes desnecessários do valor). Este artigo contém exemplos de conversão de um datetimeoffset valor para uma data valor no SQL Server.



O deslocamento de data e hora tipo de dados inclui a data e hora com um deslocamento de fuso horário. Ele também tem uma parte de segundos fracionários entre 0 e 7 (isso depende de quantos segundos fracionários são atribuídos a ele). Isso é feito usando o datetimeoffset(n) sintaxe. Se você não especificar isso, ele usará 7 (o padrão). O tamanho de armazenamento desse tipo de dados é de 8, 9 ou 10 bytes (mais 1 byte para armazenar a precisão), dependendo da precisão que está sendo usada. Sua precisão é de 100 nanossegundos.

A data tipo de dados, por outro lado, inclui apenas a data. Não inclui a hora e tem uma precisão de 1 dia. Ele usa 3 bytes para armazenamento.

Ao converter um offset de data e hora valor para uma data tipo de dados, você perde a parte do tempo (incluindo o deslocamento do fuso horário). No entanto, você também reduz o tamanho do armazenamento para 3 bytes fixos. Claro, você só faria essa conversão se não precisasse da parte do horário e do deslocamento do fuso horário.

Exemplo 1 – Conversão implícita


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

Resultado:
+------------------------------------+--------- ---+| deslocamento de data e hora | data ||------------------------------------+---------- --|| 21-05-2025 10:15:30.1234567 +10:30 | 21/05/2025 |+---------------------------------------------------+------ ------+

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

Aqui podemos ver que a data valor inclui apenas a data (sem o componente de tempo). O componente de tempo, incluindo seu deslocamento de fuso horário, foi removido do valor.

Neste exemplo, o offset de data e hora value usa a precisão padrão (que resulta em 7 casas decimais). Isso resulta no tipo de dados usando 10 bytes (na verdade, 11 bytes se você contar o byte extra que armazena a precisão). A data value usa apenas 3 bytes.

Exemplo 2 – 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 data .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS date) AS 'date'; 

Resultado:
+------------------------------------+--------- ---+| deslocamento de data e hora | data ||------------------------------------+---------- --|| 21-05-2025 10:15:30.1234567 +10:30 | 21/05/2025 |+---------------------------------------------------+------ ------+

Exemplo 3 – 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 +10:30';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(date, @thedatetimeoffset) AS 'date'; 
Resultado:
+------------------------------------+--------- ---+| deslocamento de data e hora | data ||------------------------------------+---------- --|| 21-05-2025 10:15:30.1234567 +10:30 | 21/05/2025 |+---------------------------------------------------+------ ------+