Si está dispuesto a mirar solo una semana a la vez, puede canonicalizar todos los horarios de apertura/cierre para establecer números de minutos desde el comienzo de la semana, digamos domingo 0 hrs. Para cada tienda, crea una cantidad de tuplas de la forma [startTime, endTime, storeId]. (Para las horas que abarcaron la medianoche del domingo, tendría que crear dos tuplas, una que vaya al final de la semana y otra que comience al principio de la semana). Este conjunto de tuplas se indexaría (digamos, con un árbol que preprocesaría) tanto en startTime como en endTime. Las tuplas no deberían ser tan grandes:solo hay ~ 10k minutos en una semana, que pueden caber en 2 bytes. Esta estructura sería elegante dentro de una tabla MySQL con índices apropiados y sería muy resistente a las inserciones y eliminaciones constantes de registros a medida que cambia la información. Su consulta sería simplemente "seleccione storeId donde startTime <=time and endtime>=time", donde time eran los minutos canonizados desde la medianoche del domingo.
Si la información no cambia muy a menudo y desea que las búsquedas sean muy rápidas, puede resolver todas las consultas posibles por adelantado y almacenar en caché los resultados. Por ejemplo, solo hay 672 períodos de cuarto de hora en una semana. Con una lista de negocios, cada uno de los cuales tenía una lista de horarios de apertura y cierre como la solución de Brandon Rhodes, simplemente podía recorrer cada período de 15 minutos en una semana, averiguar quién está abierto y luego almacenar la respuesta en una tabla de búsqueda. o lista en memoria.