sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona pg_sleep_until() en PostgreSQL

En PostgreSQL, puede usar pg_sleep_until() función para retrasar la ejecución hasta una marca de tiempo especificada.

Esto es útil cuando se desea despertarse a una hora específica.

Tenga en cuenta que pg_sleep_until no se garantiza que se despierte exactamente a la hora especificada, pero no se despertará antes.

Sintaxis

La sintaxis es así:

pg_sleep_until(timestamp with time zone)

Ejemplo

Aquí hay un ejemplo para demostrar su uso.

\x
SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:30'),
  clock_timestamp();

Resultado (usando salida vertical):

clock_timestamp | 2020-06-28 15:29:54.564608+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:30:00.0119+10

Usé clock_timestamp() en este ejemplo, porque cambia durante la ejecución de la sentencia. Esto nos permite ver los valores actualizados a medida que avanza la declaración.

Usé la visualización expandida (a veces denominada "salida vertical") en este ejemplo para que sea más fácil ver el resultado.

Puede alternar la visualización expandida en psql usando \x .

Ejemplo 2

Aquí hay otro ejemplo, esta vez con una llamada adicional a pg_sleep_until() y clock_timestamp() .

SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:32'),
  clock_timestamp(),
  pg_sleep_until('today 15:33'),
  clock_timestamp();

Resultado (usando salida 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

Ejemplo 3

En este ejemplo, especifico explícitamente la compensación de fecha/hora y zona horaria.

Además, ejecuto la consulta después de que haya pasado la primera marca de tiempo. Por lo tanto, se ejecuta inmediatamente.

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 salida 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 muestra el resultado, no comencé a ejecutar la consulta hasta 17 segundos después del primer pg_sleep_until() valor, por lo que se ejecutó inmediatamente y usó la marca de tiempo en el momento en que se ejecutó.

Mis marcas de tiempo estaban todas en rápida sucesión en estos ejemplos, porque no quería esperar horas o días solo para actualizar este artículo. Pero puede continuar y especificar una fecha diferente si es necesario.