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 oCONVERT()
função em vez deCAST()
.
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 oDATEADD()
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.