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

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


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, 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 |
+------------+------------------------------------+------------------------------------+