печать часов работы ресторана из таблицы базы данных в удобочитаемом формате с использованием php - PullRequest
6 голосов
/ 23 июня 2010

У меня есть таблица, в которой перечислены часы работы ресторанов.столбцами являются id, eateries_id, day_of_week, start_time и end_time.каждая закусочная представлена ​​в таблице несколько раз, потому что для каждого дня есть отдельная запись.см. этот предыдущий вопрос для более подробной информации: определите, открыт ли сейчас ресторан (как yelp), используя базу данных, php, js

Теперь мне интересно, как взять данные из этоготаблица и распечатать его в удобочитаемом формате.например, вместо того, чтобы сказать «M 1-3, T 1-3, W 1-3, Th 1-3, F 1-8», я хотел бы сказать «M-Th 1-3, F 1-8»,аналогично, я хочу «М 1-3, 5-8» вместо «М 1-3, М 5-8».Как я могу сделать это без метода грубой силы из многочисленных операторов if?

спасибо.

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Вы хотите объединить несколько интервалов для каждого дня.Придерживайтесь 24-часового формата (на самом деле сначала конвертируйте его в секунды), пока вам не придется конвертировать его в более удобный для человека формат.

http://pyinterval.googlecode.com/svn/trunk/html/index.html

Беда в том, что если вы разрешите секунды ... ресторан, который закрывается на 1 секунду раньше, будет пропущен :( Возможно, вам нужно разрешить 15- или 5-минутные приращения.Если необходимо, округлите данные в БД. Итак, подход такой: использование структуры данных интервалов, объединение всех интервалов для заданного дня. Теперь обратный словарь. Вместо отображения дней в интервалы, отображение интервалов в дни. Теперь поискспособ интеллектуального представления этих групп дней. Например, set(1,2,3) может отображаться как «МВт», поэтому я бы посоветовал: для каждого набора мощности из набора {1,2,3,4,5,6,7} (или {1,2,3,4,5}) найти наилучшее человеческое представление(от руки). Теперь жестко закодируйте эту логику - сохраните ее в словарь, который отображает отсортированную строку (это важно), такую ​​как «1235», в человеческое представление, такое как«MW, F». Отображать 1-3, 5-8 легко, если вы работаете с интервальным объектом, как описано в ссылке выше. Удачи! Дайте мне знать, с какими проблемами вы столкнулись.

РЕДАКТИРОВАТЬ:

Это не лучший пример, который у них есть (не показывает объединение перекрывающихся интервалов), но вас беспокоит оператор "|"

unioned:

>>> interval[1, 4] | interval[2, 5]
interval([1.0, 5.0])

>>> interval[1, 2] | interval[4, 5]
interval([1.0, 2.0], [4.0, 5.0])

Вы можете просто реализовать этот класс самостоятельно, но он может быть подвержен ошибкам.

2 голосов
/ 23 июня 2010

Думал, что у меня будет удар.

Тестовый стол

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`)
) 

Данные испытаний

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

Просмотр определения для объединения часов работы по дням

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`

Запрос на поиск «островков» смежных дней с одинаковыми часами работы (по одному из них Ицик Бен Ган)

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

Результаты

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...