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

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


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