La tarea es sencilla si la piensas.
Tienes una tabla de rangos de horas y una de citas programadas:
Código SQL
[-]
--CITAS
08:00 am - 08:30 am 15/8/2019
09:00 am - 9:30 am 16/8/2019
Solo tienes que hacer un WHERE del nuevo rango y la fecha. Si existe entonces ya esta agarrada. Para hacerlo como un conjunto solo creas una tabla dinamica en memoria (no he chequeado el sql pero es maso):
Código SQL
[-]
SELECT current_date as fecha CROSS JOIN TablaRangos R WHERE (current_date, R.rango) NOT IN (SELECT (date, R.rango) FROM citas)