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 |+---------------------------------------------------+------ ------+