Este artigo contém exemplos de conversão de uma data valor para um smalldatetime valor no SQL Server.
Ao converter uma data valor para smalldatetime , informações extras são adicionadas ao valor. Isso ocorre porque o smalldatetime tipo de dados contém informações de data e hora. A data O tipo de dados, por outro lado, contém apenas informações de data.
No entanto, há casos em que uma data para pequena data e hora conversão pode falhar. Em particular, se a data o valor está fora do intervalo suportado por smalldatetime então ele falhará com um erro.
De qualquer forma, abaixo estão exemplos de conversão entre esses dois tipos de dados.
Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre data e pequena data e hora .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @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. Nesse caso, o SQL Server realiza uma conversão implícita nos bastidores quando tentamos atribuir a data valor para um smalldatetime variável.
Podemos ver que a data A variável contém apenas informações de data, enquanto a variável smalldatetime A variável contém informações de data e hora.
Quando você converte entre data e pequena data e hora , o componente de tempo é definido como
00:00:00
. Isso fornece uma precisão ao minuto. A razão pela qual são todos zeros é porque o valor de data não contém nenhuma informação de hora, portanto, não há como o SQL Server saber a que horas você deseja (se houver).
Claro, você também obtém esse resultado mesmo se você simplesmente atribuir um valor somente de data a um pequenodatahora 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 você precisar especificar uma hora (mas manter a mesma data), você pode usar o
DATEADD()
função para fazer exatamente isso. DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @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 o
CAST()
função diretamente dentro do SELECT
declaração para converter explicitamente entre data e pequena data e hora . DECLARE @thedate date SET @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 | +------------+---------------------+
Mesmo resultado da conversão implícita.
Também podemos ajustar o tempo assim:
DECLARE @thedate date SET @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 o
CONVERT()
função em vez de CAST()
. DECLARE @thedate date SET @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 o tempo:
DECLARE @thedate date SET @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
Conforme mencionado, se a data estiver fora do intervalo suportado pelo smalldatetime tipo de dados, você receberá um erro.
DECLARE @thedate date SET @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 pequeno datetime tipo de dados suporta apenas intervalos de datas de 1900-01-01 a 2079-06-06.
Além disso, o smalldatetime tipo de dados suporta apenas intervalos de tempo de 00:00:00 a 23:59:59, portanto, você também receberá um erro se tentar usar um valor fora desse intervalo (por exemplo, com uma precisão mais alta).
Exemplo:
DECLARE @thedate date SET @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 o
DATEADD()
função (porque a função não permite que essa parte de data específica seja usada em uma pequena data e hora tipo de dados).