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.