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

Exemplos de conversão de 'data' para 'smalldatetime' no SQL Server (T-SQL)


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).