Este artigo contém exemplos de conversão de um valor de data para um valor de ‘smallldatetime’ no SQL Server.
Quando você converte um valor de data para um valor de data pequeno, informações extras são adicionadas ao valor. Isto é porque o tipo de dados de tempo reduzido contém informação de data e hora. O tipo de dados de data, por outro lado, contém apenas informação de data.
No entanto, há casos em que uma conversão de data para hora pequena pode falhar. Em particular, se o valor da data estiver fora do intervalo suportado pelo tempo de validade pequeno, então falhará com um erro.
Em qualquer caso, abaixo estão exemplos de conversão entre estes dois tipos de dados.
Exemplo 1 – Conversão Implícita
Aqui está um exemplo de uma conversão implícita entre data e smallldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00: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. Neste caso, o SQL Server realiza uma conversão implícita nos bastidores quando tentamos atribuir o valor da data a uma variável de tempo pequeno.
Vemos que a variável de data contém apenas informação de data, enquanto que, a variável de tempo pequeno contém informação de data e hora.
Quando você converte entre data e hora pequena, o componente de tempo é definido como 00:00:00
. Isto fornece uma precisão para o minuto.
A razão de tudo isto ser zeros é porque o valor da data não contém nenhuma informação de hora, por isso não há maneira do SQL Server saber a hora que você quer (se houver).
O claro, você também obtém este resultado mesmo que simplesmente atribua um valor apenas de data a uma pequena hora sem realizar uma conversão:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';
Resultado:
+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+
Exemplo 2 – Modificar a Hora
Se precisar especificar uma hora (mas manter a mesma data), você pode usar a função DATEADD()
para fazer exatamente isso.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplo 3 – Conversão Explícita usando CAST()
Aqui está um exemplo de uma conversão explícita. Neste caso, eu uso a função CAST()
diretamente dentro da instrução SELECT
para converter explicitamente entre a data e a hora do pequeno prazo.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
O mesmo resultado que a conversão implícita.
Tambem podemos ajustar o tempo assim:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplo 4 – Conversão Explícita usando CONVERT()
Aqui está um exemplo de uma conversão explícita usando a função CONVERT()
em vez de CAST()
.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
E ajustando a hora:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Resultado:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplo 5 – Erro fora do intervalo
Como mencionado, se a data estiver fora do intervalo suportado pelo tipo de dados de tempo reduzido, você receberá um erro.
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Resultado:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
O tipo de dados de tempo de atraso só suporta os intervalos de data 1900-01-01 até 2079-06-06.
Tempo pequeno, o tipo de dados de tempo pequeno suporta apenas intervalos de tempo de 00:00:00 até 23:59:59, portanto você também receberá um erro se tentar usar um valor fora desse intervalo (por exemplo, com uma maior precisão).
Exemplo:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Resultado:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
No entanto, neste caso, não é um erro durante a conversão, é na verdade um erro ao usar a função DATEADD()
(porque a função não permite que essa parte específica de data seja usada em um tipo de dado de tempo reduzido).