PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como a função timezone() funciona no PostgreSQL


No PostgreSQL, você pode usar o timezone() função para converter um carimbo de data/hora para outro fuso horário.

Sintaxe


A sintaxe fica assim:
timezone(zone, timestamp)

Onde zone é o fuso horário que você deseja que o timestamp argumento a ser convertido.

O resultado obtido dependerá se o valor do carimbo de data/hora original inclui um fuso horário ou não (e qual é esse valor).

Exemplo 1 -Quando o carimbo de data/hora original NÃO inclui o fuso horário


Veja o que acontece quando o carimbo de data/hora original inclui o fuso horário.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');

Resultado:
2020-10-25 04:00:00

Quando o carimbo de data/hora original inclui o fuso horário, o timezone() A função muda o valor do carimbo de data/hora original para o fuso horário especificado e retorna o valor sem fuso horário.

Aqui está o que acontece se eu alterar o fuso horário do timestamp de entrada.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');

Resultado:
2020-10-25 03:00:00

O timestamp resultante é deslocado de acordo com o fuso horário de entrada.

E se você especificar timestamp with time zone , mas o carimbo de data/hora original não inclui um fuso horário, então o valor do carimbo de data/hora original é deslocado para o fuso horário local.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');

Resultado:
2020-10-24 18:00:00

Nesse caso, o timestamp resultante foi adiado em seis horas. Isso significa que meu fuso horário local está seis horas à frente do Indian/Maurício.

Podemos ver o deslocamento de fuso horário que foi usado selecionando o valor de entrada diretamente.
SELECT timestamp with time zone '2020-10-25 00:00:00';

Resultado:
2020-10-25 00:00:00+10

Exemplo 2 – Quando o carimbo de data/hora original NÃO inclui o fuso horário


Veja o que acontece quando o carimbo de data/hora original não incluir um fuso horário.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');

Resultado:
2020-10-25 06:00:00+10

Quando o carimbo de data/hora original não inclui um fuso horário, o resultado é exibido usando o TimeZone atual configuração e o deslocamento do fuso horário é anexado.

Isso se aplica sempre que você especificar timestamp without time zone , mesmo que o carimbo de data/hora contenha de fato um deslocamento de fuso horário.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');

Resultado:
2020-10-25 06:00:00+10

Isso é esperado, porque se eu selecionar apenas o timestamp without time zone valor, isso é o que eu recebo:
SELECT timestamp without time zone '2020-10-25 00:00:00+12';

Resultado:
2020-10-25 00:00:00

Exemplo 3 – carimbo de data/hora local


Vamos usar o localtimestamp função para executar uma comparação entre o timestamp atual no meu próprio fuso horário e o timestamp resultante após usar o timezone() função para convertê-lo para um fuso horário diferente.
\x
SELECT 
  localtimestamp,
  timezone('Indian/Mauritius', localtimestamp);

Resultado:
localtimestamp | 2020-07-08 15:42:04.965221
timezone       | 2020-07-08 21:42:04.965221+10

O localtimestamp função retorna um timestamp tipo de dados, que vem com um implícito “sem fuso horário”. Em outras palavras, carimbo de data e hora e timestamp sem fuso horário são a mesma coisa.

Conforme demonstrado anteriormente, quando nenhum fuso horário é especificado no timestamp original, o TimeZone atual configuração é usada e anexada ao resultado. E é isso que obtemos ao usar localtimestamp .

A propósito, neste exemplo eu usei \x para exibir o resultado usando exibição expandida/saída vertical, apenas para facilitar a leitura.

Exemplo 4 – current_timestamp


Agora vamos usar o current_timestamp função em vez de localtimestamp .
SELECT 
  current_timestamp,
  timezone('Indian/Mauritius', current_timestamp);

Resultado (usando saída vertical):
current_timestamp | 2020-07-08 15:42:04.335669+10
timezone          | 2020-07-08 09:42:04.335669

Desta vez, o deslocamento do fuso horário foi anexado ao carimbo de data e hora original e o timezone() resultado não o inclui mais.

Obtemos este resultado porque o current_timestamp função retorna um timestamp com fuso horário tipo de dados.

Exemplo 5 – Usando valores de tempo


O timezone() função também funciona com time valores (time with time zone e time without time zone ).

No entanto, ao usá-lo em time with time zone valores, o deslocamento do fuso horário é anexado ao resultado.
SELECT 
  timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time with time zone '00:00:00');

Resultado (usando saída vertical):
timezone | 04:00:00+04
timezone | 03:00:00+04
timezone | 18:00:00+04

E para completar, aqui estão esses mesmos valores usando um time without time zone tipo de dados.
SELECT 
  timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
  timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
  timezone('Indian/Mauritius', time without time zone '00:00:00');

Resultado (usando saída vertical):
timezone | 18:00:00+04
timezone | 18:00:00+04
timezone | 18:00:00+04

Verifique o fuso horário local


Se você quiser verificar seu próprio fuso horário local, execute SHOW TIMEZONE .

Aqui está o que recebo quando executo esse comando.
SHOW TIMEZONE;

Resultado:
Australia/Brisbane

Verifique o deslocamento do fuso horário


Armado com o conhecimento acima, agora posso verificar os dois deslocamentos de fuso horário consultando o pg_timezone_names visualizar.
SELECT * 
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';

Resultado (usando saída vertical):
name                | abbrev | utc_offset | is_dst
--------------------+--------+------------+--------
Indian/Mauritius    | +04    | 04:00:00   | f
Australia/Brisbane  | AEST   | 10:00:00   | f

Consulte Retornar uma lista de fusos horários suportados pelo PostgreSQL para obter mais opções e exemplos de como retornar o fuso horário no Postgres.