Thought I would have bash.
Test table
CREATE TABLE `opening_hours` ( `id` int(11) NOT NULL AUTO_INCREMENT, `eateries_id` int(11) DEFAULT NULL, `day_of_week` int(11) DEFAULT NULL, `start_time` time DEFAULT NULL, `end_time` time DEFAULT NULL, PRIMARY KEY (`id`) )
Test Data
INSERT INTO `test`.`opening_hours` ( `eateries_id`, `day_of_week`, `start_time`, `end_time`) SELECT 2 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 1 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 2 AS day_of_week, '17:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 2 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 2 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time union all SELECT 3 AS eateries_id, 1 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 2 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 3 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 4 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 3 AS eateries_id, 5 AS day_of_week, '13:00' AS start_time, '15:00' as end_time union all SELECT 3 AS eateries_id, 6 AS day_of_week, '13:00' AS start_time, '20:00' as end_time union all SELECT 3 AS eateries_id, 7 AS day_of_week, '13:00' AS start_time, '21:00' as end_time
View definition for daylight hours consolidation
CREATE VIEW `test`.`groupedhours` AS select `test`.`opening_hours`.`eateries_id` AS `eateries_id`, `test`.`opening_hours`.`day_of_week` AS `day_of_week`, group_concat(concat(date_format(`test`.`opening_hours`.`start_time`,'%l'),' - ',date_format(`test`.`opening_hours`.`end_time`,'%l %p')) order by `test`.`opening_hours`.`start_time` ASC separator ', ') AS `OpeningHours` from `test`.`opening_hours` group by `test`.`opening_hours`.`eateries_id`,`test`.`opening_hours`.`day_of_week`
A request to search for βislandsβ of adjacent days with the same hours of operation (based on Itzik Ben Gan)
SET @rownum = NULL; SET @rownum2 = NULL; SELECT S.eateries_id, concat(CASE WHEN S.day_of_week <> E.day_of_week THEN CONCAT(CASE S.day_of_week WHEN 1 THEN 'Su' WHEN 2 THEN 'Mo' WHEN 3 THEN 'Tu' WHEN 4 THEN 'We' WHEN 5 THEN 'Th' WHEN 6 THEN 'Fr' WHEN 7 THEN 'Sa' End, ' - ') ELSE '' END, CASE E.day_of_week WHEN 1 THEN 'Su' WHEN 2 THEN 'Mo' WHEN 3 THEN 'Tu' WHEN 4 THEN 'We' WHEN 5 THEN 'Th' WHEN 6 THEN 'Fr' WHEN 7 THEN 'Sa' End, ' ', S.OpeningHours) AS `Range` FROM ( SELECT A.day_of_week, @rownum := IFNULL(@rownum, 0) + 1 AS rownum, A.eateries_id, A.OpeningHours FROM `test`.`groupedhours` as A WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B WHERE A.eateries_id = B.eateries_id AND A.OpeningHours = B.OpeningHours AND B.day_of_week = A.day_of_week -1) ORDER BY eateries_id,day_of_week) AS S JOIN ( SELECT A.day_of_week, @rownum2 := IFNULL(@rownum2, 0) + 1 AS rownum, A.eateries_id, A.OpeningHours FROM `test`.`groupedhours` as A WHERE NOT EXISTS(SELECT * FROM `test`.`groupedhours` B WHERE A.eateries_id = B.eateries_id AND A.OpeningHours = B.OpeningHours AND B.day_of_week = A.day_of_week + 1) ORDER BY eateries_id,day_of_week) AS E ON S.eateries_id = E.eateries_id AND S.OpeningHours = S.OpeningHours AND S.rownum = E.rownum
results
eateries_id Range 2 Su - Mo 1 - 3 PM, 5 - 8 PM 2 Tu 1 - 3 PM 2 We 1 - 8 PM 2 Th 1 - 3 PM 2 Fr 1 - 8 PM 2 Sa 1 - 9 PM 3 Su - Tu 1 - 3 PM 3 We 1 - 8 PM 3 Th 1 - 3 PM 3 Fr 1 - 8 PM 3 Sa 1 - 9 PM