Este artigo contém exemplos de conversão de um tempo valor para um smalldatetime valor no SQL Server.
Quando você converte um tempo valor para smalldatetime , a data é definida como '1900-01-01' e os valores de hora e minuto são arredondados para cima. Os segundos e segundos fracionários são definidos como 0.
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 pequena data e hora . DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Resultado:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Portanto, uma parte de data é adicionada e definida como '1900-01-01' e, neste caso, os valores dos minutos são arredondados e os segundos definidos como 0.
A documentação da Microsoft afirma que os segundos fracionários também são definidos como zero, mas o smalldatetime tipo de dados não inclui segundos fracionários de qualquer maneira.
A propósito, sempre que você usar o smalldatetime tipo de dados, o componente de segundos é sempre definido como 0.
Exemplo 2 – Arredondando a hora
Aqui está um exemplo da hora sendo arredondada:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Resultado:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
Nesse caso, também especifiquei uma escala de 0 para o valor de tempo, no entanto, isso não afeta o resultado.
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. Quando especificamos uma escala de 0, significa que a parte fracionária não está incluída.
Exemplo 3 – Conversão explícita usando CONVERT()
Aqui está um exemplo usando o
CONVERT()
função em vez de CAST()
. DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Resultado:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
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, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
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 realiza uma conversão implícita nos bastidores quando tentamos atribuir o tempo valor para um smalldatetime 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, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
Neste caso, acrescento 85 ao valor do ano, o que o leva a 1985.
No entanto, esteja ciente de que smalldatetime suporta um intervalo de datas muito estreito (1900-01-01 a 2079-06-06), portanto, adicionar muito ao ano pode resultar em um erro de estouro como o abaixo:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Resultado:
Adding a value to a 'smalldatetime' column caused an overflow.