首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用php从数据库表中以人类可读的格式打印餐厅营业时间

使用php从数据库表中以人类可读的格式打印餐厅营业时间
EN

Stack Overflow用户
提问于 2010-06-24 02:55:24
回答 2查看 2.3K关注 0票数 6

我有一张桌子,上面列出了餐馆的营业时间。这些列是id、eateries_id、day_of_week、start_time和end_time。每家餐馆在表中多次出现,因为每一天都有单独的条目。有关更多详细信息,请参阅前面的问题:determine if a restaurant is open now (like yelp does) using database, php, js

我现在想知道如何从这个表中提取数据,并以人类可读的格式打印出来。例如,不是说“M1-3,T1-3,W1-3,Th1-3,F1-8”,我想说"M -Th1-3,F1-8“。同样,我想要“M1-3,5-8”而不是“M1-3,M5-8”。如果没有大量if语句的强力方法,我该如何做到这一点?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2010-06-24 03:27:15

我想我会大吃一惊的。

测试表

代码语言:javascript
复制
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`)
) 

测试数据

代码语言:javascript
复制
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

按天合并营业时间的视图定义

代码语言:javascript
复制
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`

查询以查找具有相同开放时间的连续日期的“岛”(基于Itzik Ben Gan的查询)

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-06-24 03:47:28

您希望将每天的一组间隔合并起来。坚持24小时格式(实际上我猜是先把它转换成秒),直到你不得不把它转换成更友好的格式。

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

问题是当你允许秒数的时候。提前1秒关门的餐厅将被错过:(也许您需要允许15或5个-minute增量。如果有必要,对DB中的数据进行四舍五入。因此,方法是:使用间隔数据结构,将给定日期的所有间隔合并在一起。现在颠倒字典。不是将天映射到时间间隔,而是将时间间隔映射到天。现在,找到一种方法来智能地表示这些天数组。例如,set(1,2,3)可以显示为"M-W",所以我建议:对于集合{1,2,3,4,5,6,7} (或{1,2,3,4,5})的每个幂集合,(手动)找到最佳的人类表示。现在将这个逻辑硬编码到字典中,字典将排序的字符串(这一点很重要)映射到人类表示(如"M-W,F“)。显示1-3,5-8很容易,一旦你使用一个间隔对象,如上面的链接所述。祝好运!让我知道你遇到了什么问题。

编辑:

这不是它们的最佳示例(没有显示重叠间隔的并集),但是您需要注意"|“运算符

代码语言:javascript
复制
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])

您可以自己实现这个类,但它可能容易出现bug。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3104618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档