Este artigo contém exemplos de conversão de uma data valor para um offset de data e hora valor no SQL Server.
Ao converter uma data valor para datetimeoffset , informações extras são adicionadas ao valor. Isso ocorre porque o offset de data e hora tipo de dados contém informações de data e hora, bem como as informações de deslocamento de hora. Em outras palavras, o deslocamento de data e hora tipo de dados define uma data que é combinada com uma hora do dia que tem reconhecimento de fuso horário e é baseada em um relógio de 24 horas. A data O tipo de dados, por outro lado, contém apenas informações de data.
Quando convertemos de data para deslocamento de data e hora , a hora (e o deslocamento do fuso horário) são adicionados automaticamente ao valor. No entanto, você sempre pode alterar o valor, se necessário (incluindo o deslocamento de fuso horário).
O deslocamento de data e hora tipo de dados também permite especificar a precisão de segundos fracionários. Se você não especificar isso, ele usará uma escala de 7. Isso significa que incluirá 7 dígitos no lado direito do ponto decimal.
Exemplo 1 – Conversão implícita
Aqui está um exemplo de uma conversão implícita entre data e deslocamento de data e hora .
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +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 offset de data e hora variável.
Podemos ver que a data A variável contém apenas informações de data, enquanto a variável datetimeoffset A variável contém informações de deslocamento de data, hora e fuso horário.
Quando você converte entre data e datetimeoffset(7) (ou seja, usando uma escala de 7), o componente de tempo é definido como
00:00:00.0000000 +00:00
. Este também é o valor padrão, então você pode omitir o valor de precisão e usará uma escala de 7 (o que resulta em uma precisão de 34). Você pode reduzir a precisão, se preferir. Reduzir a precisão também pode reduzir a quantidade de espaço necessária para armazenar o valor. Só para ficar claro, escala é o número de dígitos à direita do ponto decimal em um número. Precisão é o número total de dígitos no número.
Exemplo 2 – 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 deslocamento de data e hora . DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
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, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Observe que você não pode usar o
DATEADD()
função para modificar o componente de deslocamento de tempo. Mas não se preocupe, há uma maneira de modificá-lo (leia para descobrir como). Exemplo 3 – 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(datetimeoffset, @thedate) AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
E ajustando o tempo:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Exemplo 4 – Modificar a compensação de tempo
Nos exemplos anteriores usamos o
DATEADD()
função para modificar o valor do tempo. Esta função pode ser usada para modificar qualquer parte do componente de data ou hora, exceto o componente de deslocamento de hora . Se você precisar modificar o deslocamento de tempo, você pode usar o
TODATETIMEOFFSET()
função. Você também pode usar esta função para converter a data original valor para um offset de data e hora valor. Esta função aceita um valor de data (que pode resolver para um datetime2 valor) e um valor de deslocamento. Aqui está um exemplo:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset SET @thedate = '2020-12-01' SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00') SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
E aqui está um exemplo usando a função dentro do
SELECT
demonstração:DECLARE @thedate date = '2020-12-01' SELECT @thedate AS 'date', TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';
Resultado:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
O
TODATETIMEOFFSET()
função também aceita um datetimeoffset value como seu primeiro parâmetro, então você também pode usá-lo para modificar o datetimeoffset existente valores se necessário. Exemplo:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
Resultado:
+------------+------------------------------------+------------------------------------+ | date | datetimeoffset | Modified | |------------+------------------------------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+------------------------------------+