Este artigo contém exemplos de conversão de um datetimeoffset valor para smalldatetime no SQL Server.
Ao converter um offset de data e hora valor para smalldatetime , a data e as horas são copiadas. Os minutos são arredondados para cima (dependendo do valor dos segundos) e os segundos são definidos como 0.
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 (mais 1 byte para a precisão), dependendo da precisão que está sendo usada. O pequeno datetime Por outro lado, o tipo de dados não tem reconhecimento de fuso horário e, portanto, não inclui nenhum deslocamento de fuso horário. Ele também não possui segundos fracionários e seu componente de segundos é sempre definido como zero (:00). Sua precisão é para o minuto mais próximo. O tamanho de armazenamento desse tipo de dados é fixado em 4 bytes.
Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre datetimeoffset e pequena data e hora .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thesmalldatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------------------------------+--------- ------------+| deslocamento de data e hora | smalldatetime ||------------------------------------+---------- -----------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+---------------------------------------------------+- --------------------+
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 smalldatetime variável.
Podemos ver que o smalldatetime variável não tem precisão de segundos fracionários e seus segundos foram definidos como zero. Além disso, os minutos foram arredondados para cima, devido ao fato de o valor original ter um valor de segundos de 30.
Outra observação é que o deslocamento do fuso horário foi truncado – o smalldatetime tipo de dados não tem reconhecimento de fuso horário.
Nesta conversão, o tamanho do armazenamento diminuiu de 10 bytes (11 bytes quando você conta a precisão) para datetimeoffset , para 4 bytes para smalldatetime .
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 pequena data e hora . DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetime) AS 'smalldatetime';
Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | smalldatetime ||------------------------------------+---------- ---------------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+---------------------------------------------------+- ------------------------+Exemplo 3 – 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(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';
Resultado:
+------------------------------------+--------- ----------------+| deslocamento de data e hora | smalldatetime ||------------------------------------+---------- ---------------|| 21-05-2025 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+---------------------------------------------------+- ------------------------+