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.