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.