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

Exemplos de conversão de 'date' para 'datetime2' no SQL Server (T-SQL)


Este artigo contém exemplos de conversão de uma data valor para um datetime2 valor no SQL Server.

Ao converter uma data valor para datetime2 , informações extras são adicionadas ao valor. Isso ocorre porque o datetime2 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.

O datetime2 tipo de dados é basicamente uma extensão do datetime tipo de dados. Ele tem um intervalo de datas maior, uma precisão fracionária padrão maior e uma precisão opcional especificada pelo usuário.

Em qualquer caso, o processo de conversão é exatamente o mesmo, independentemente do tipo de dados. A única diferença é a quantidade de informações disponíveis entre data , datahora e datetime2 .


Exemplo 1 – Conversão implícita


Aqui está um exemplo de uma conversão implícita entre data e datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

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 datetime2 variável.

Podemos ver que a data A variável contém apenas informações de data, enquanto a variável datetime2 A variável contém informações de data e hora.

Além disso, obtemos mais informações de tempo do que obteríamos se as convertíssemos para o datetime tipo de dados.

Quando você converte entre data e datetime2 usando a precisão padrão (7), o componente de tempo é definido como 00:00:00.0000000 (comparado com 00:00:00.000 para datahora ). Você pode reduzir a precisão se preferir (veja abaixo). Reduzir a precisão também pode reduzir a quantidade de espaço necessária para armazenar o valor.

O motivo pelo qual o componente de hora é todo zero é 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).

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, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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 datetime2 .
DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetime2) AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Assim, obtemos o 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, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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(datetime2, @thedate) AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

E ajustando o tempo:
DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';

Resultado:
+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Exemplo 5 – Precisão


O datetime2 tipo de dados permite especificar a precisão (até o padrão 7). Em outras palavras, você não precisa usar os 7 dígitos completos se não precisar.

Exemplo:
DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
  CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';

Resultado:
+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

Um benefício de reduzir a precisão é que ela também pode reduzir a quantidade de espaço necessária para armazenar o valor. Em particular, 6 bytes para precisão menor que 3, 7 bytes para precisão 3 ou 4 e todas as outras precisão requerem 8 bytes. No entanto, observe que o primeiro byte é usado para armazenar a precisão, portanto, o valor real é o tamanho de armazenamento indicado aqui mais 1 byte adicional para armazenar a precisão.