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

Exemplos de conversão de 'time' para 'datetime' no SQL Server (T-SQL)


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

Quando você converte um tempo valor para datetime , informações extras são adicionadas ao valor. Isso ocorre porque o datetime tipo de dados contém informações de data e hora. A hora O tipo de dados, por outro lado, contém apenas informações de tempo. Portanto, as informações de data são adicionadas ao valor quando você executa essa conversão. Especificamente, a data está definida como '1900-01-01'.


Exemplo 1 – 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 instrução para converter explicitamente de tempo para datahora .
DECLARE @thetime timeSET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';

Resultado:
+------------------+-------------------------+| tempo | datahora ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+

Quando você converte de tempo para datahora , o componente de data é definido como 1900-01-01 .

Observe também que o próprio valor de tempo é apresentado de forma diferente em ambos os tipos de dados. A hora tipo de dados adiciona um zero ao final (porque tem uma precisão mais alta – sua escala padrão é 7). Por outro lado, datetime os valores usam uma escala menor e são arredondados para incrementos de 0,000, 0,003 ou 0,007 segundos. Se você achar isso problemático, considere converter para datetime2 em vez de.

Exemplo 2 – menor precisão/escala


No exemplo anterior, o tempo valor tinha uma precisão de segundos fracionários mais alta do que o datetime valor. Isso ocorre porque ele usa uma escala padrão de 7. Mas podemos alterar isso para um valor menor, se necessário.

Só para ficar claro, escala é o número de dígitos à direita do ponto decimal em um número. Precisão é o número total de dígitos no número. Podemos especificar a escala anexando um número entre colchetes ao tipo de dados.

Veja o que acontece se eu definir explicitamente a hora valor para ter um valor menor escala do que datetime valor.
DECLARE @thetime time(0)SET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';

Resultado:
+----------+-------------------------+| tempo | datahora ||----------+-------------------------|| 23:15:59 | 1900-01-01 23:15:59.000 |+----------+-------------------------+ 

Exemplo 3 – Conversão explícita usando CONVERT()


Este é o mesmo que o primeiro exemplo, exceto que desta vez eu uso o CONVERT() função em vez de CAST() .
DECLARE @thetime timeSET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CONVERT(datetime, @thetime) AS 'datetime';

Resultado:
+------------------+-------------------------+| tempo | datahora ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+

Exemplo 4 – Conversão implícita


Aqui está um exemplo de como fazer a mesma coisa, mas usando uma conversão de tipo implícita.
DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSELECT @thetime AS 'time', @thedatetime AS 'datetime';

Resultado:
+------------------+-------------------------+| tempo | datahora ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+

Assim, obtemos o mesmo resultado, independentemente de ser uma conversão explícita ou implícita.

Esta é uma conversão implícita porque não estamos usando uma função de conversão para convertê-la explicitamente. Estamos simplesmente atribuindo o valor de uma variável de um tipo de dados a uma variável de outro tipo de dados. Nesse caso, o SQL Server executa uma conversão implícita nos bastidores quando tentamos atribuir o tempo valor para um datetime variável.

Exemplo 5 – Alterar a data


Se você precisar alterar a data (mas manter a mesma hora), você pode usar o DATEADD() função.
DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSET @thedatetime =DATEADD(year, 120, @thedatetime)SELECT @thetime AS 'time', @thedatetime AS 'datahora';

Resultado:
+------------------+-------------------------+| tempo | datahora ||------------------+-------------------------|| 23:15:59.0040070 | 01-01-2020 23:15:59.003 |+------------------+------------------- ------+

Nesse caso, acrescento 120 ao valor do ano, o que o traz para 2020.