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

Como pg_sleep_until() funciona no PostgreSQL


No PostgreSQL, você pode usar o pg_sleep_until() função para atrasar a execução até um timestamp especificado.

Isso é útil quando se deseja um horário de despertar específico.

Observe que pg_sleep_until não é garantido que acorde exatamente na hora especificada, mas não acordará mais cedo.

Sintaxe


A sintaxe fica assim:
pg_sleep_until(timestamp with time zone)

Exemplo


Aqui está um exemplo para demonstrar seu uso.
\x
SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:30'),
  clock_timestamp();

Resultado (usando saída vertical):
clock_timestamp | 2020-06-28 15:29:54.564608+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:30:00.0119+10

Eu usei clock_timestamp() neste exemplo, porque muda durante a execução da instrução. Isso nos permite ver os valores atualizados à medida que a instrução avança.

Usei a exibição expandida (às vezes chamada de “saída vertical”) neste exemplo para facilitar a visualização do resultado.

Você pode alternar a exibição expandida no psql usando \x .

Exemplo 2


Aqui está outro exemplo, desta vez com uma chamada extra para pg_sleep_until() e clock_timestamp() .
SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:32'),
  clock_timestamp(),
  pg_sleep_until('today 15:33'),
  clock_timestamp();

Resultado (usando saída vertical):
clock_timestamp | 2020-06-28 15:31:23.142358+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:32:00.061566+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:33:00.074381+10

Exemplo 3


Neste exemplo, especifico explicitamente o deslocamento de data/hora e fuso horário.

Além disso, executo a consulta após o primeiro carimbo de data/hora ter passado. Portanto, ele é executado imediatamente.
SELECT 
  clock_timestamp(),
  pg_sleep_until('2020-06-29 08:54:00.000000+10'),
  clock_timestamp(),
  pg_sleep_until('2020-06-29 08:55:00.000000+10'),
  clock_timestamp();

Resultado (usando saída vertical):
clock_timestamp | 2020-06-29 08:54:17.189189+10
pg_sleep_until  |
clock_timestamp | 2020-06-29 08:54:17.189196+10
pg_sleep_until  |
clock_timestamp | 2020-06-29 08:55:00.062783+10

Como o resultado mostra, eu não comecei a executar a consulta até 17 segundos após o primeiro pg_sleep_until() value e, portanto, foi executado imediatamente e usou o carimbo de data/hora no momento em que foi executado.

Meus timestamps estavam todos em rápida sucessão nesses exemplos, porque eu não queria esperar horas ou dias apenas para atualizar este artigo. Mas você pode ir em frente e especificar uma data diferente, se necessário.