使用数据库、php、js 确定餐厅现在是不是营业(就像 yelp 一样)

Posted

技术标签:

【中文标题】使用数据库、php、js 确定餐厅现在是不是营业(就像 yelp 一样)【英文标题】:determine if a restaurant is open now (like yelp does) using database, php, js使用数据库、php、js 确定餐厅现在是否营业(就像 yelp 一样) 【发布时间】:2011-03-05 11:01:52 【问题描述】:

我想知道是否有人知道 yelp 如何确定哪些餐厅“现在营业”?我正在使用 html/javascript/php 开发一个类似的应用程序。我打算在我的数据库中每天都有一个列,以“2243”格式(晚上10:43)用逗号分隔小时。因此,例如,如果餐厅在午餐和晚餐时段营业,则可能是“1100,1400,1700,2200”。然后我会检查(使用js)当前时间是否在当天的某个范围内。我还希望能够确定餐厅是否“今晚营业”、“营业到很晚”等。对于那些我想我会检查营业范围是否与某些范围重叠。

有没有更好的方法来做到这一点?特别是,如何将小时数存储在数据库中,然后确定它们是否与给定的一组小时数重叠。

谢谢。

【问题讨论】:

你的方法不太好,数据库将很难进一步查询。请参阅 Romain 答案 - 更好的解决方案。另外,我建议您重新阅读有关数据库规范化的信息,例如 wiki en.wikipedia.org/wiki/Database_normalization 【参考方案1】:

您肯定想重新设计数据库。像这样将多个值放在一个列中是对规范化规则的极大违反,并且会在未来引起很多麻烦。单个列应始终包含单个信息。

您还应该使用正确的数据类型。不要将时间放在字符串中,因为你可能会以“foo”作为时间结束,然后你会做什么?

相反,您可能想要的是:

CREATE TABLE Restaurants
(
    restaurant_id    INT            NOT NULL,
    restaurant_name  VARCHAR(40)    NOT NULL,
    CONSTRAINT PK_Restaurants PRIMARY KEY CLUSTERED (restaurant_id)
)
CREATE TABLE Restaurant_Hours
(
    restaurant_id    INT         NOT NULL,
    hours_id         INT         NOT NULL,
    day_of_week      SMALLINT    NOT NULL,
    start_time       TIME        NOT NULL,  -- Depends on your RDBMS and which date/time datatypes it supports
    end_time         TIME        NOT NULL,
    CONSTRAINT PK_Restaurant_Hours PRIMARY KEY CLUSTERED (restaurant_id, hours_id)
)

然后,您可以轻松查看在给定时间营业的餐厅:

SELECT
    R.restaurant_id,
    R.restaurant_name
FROM
    Restaurants R
WHERE
    EXISTS
    (
        SELECT *
        FROM
            Restaurant_Hours RH
        WHERE
            RH.restaurant_id = R.restaurant_id AND
            RH.start_time <= @time AND
            RH.end_time >= @time AND
            RH.day_of_week = @day_of_week
    )

如果您有一个跨越午夜的时间段,则需要有两行 - 第一天一行,午夜一行 - 第二天的“x”。另外,从 GUI 使用时请记住记住时区。

【讨论】:

如果某些餐厅在午餐时间营业,然后在晚上营业,这也很有用,这样您每天就有两个时间行;而其他人全天开放......比解析“1100,1400,1700,2200”和“1100,2200”容易得多 感谢您的出色解决方案。我是数据库新手,但我可以看到这比我原来的想法要好得多。我会在每家餐厅的小时表中有 7 个(或更多,如果餐厅有单独的午餐/晚餐时间)条目,对吗?我想你在那个 WHERE 忘记了 RH.day_of_week = R.day_of_week,对吧? 谢谢,我已将其更正为现在包含星期几。如果餐厅每周营业 7 天,那么是的,您将有 7 排。如果他们在同一天关闭并再次打开(或有几个小时过去了午夜),那么您可能有超过 7 个。 我现在想知道如何从小时表中获取数据并以人类可读的格式打印出来。例如,我不想说“M 1-3,T 1-3,W 1-3,Th 1-3,F 1-8”,而是说“M-Th 1-3,F 1-8” .同样,我想要“M 1-3, 5-8”而不是“M 1-3, M 5-8”。如果没有大量 if 语句的蛮力方法,我怎么能做到这一点? 你可能应该开始一个新问题并参考这个问题,这样它就不会变得太混乱【参考方案2】:

我会有一个名为 REST_HOURS 的表,其中包含以下字段:

CREATE TABLE REST_HOURS (
REST_ID integer NOT NULL
,OPEN_TIME time NOT NULL
,CLOSE_TIME time NOT NULL
PRIMARY KEY ( `REST_ID` )
) ;

OPEN_TIME 和 CLOSE_TIME 的索引

然后我会做如下查询:

select REST_ID from REST_HOURS where CURTIME() >= OPEN_TIME and CURTIME() <= CLOSE_TIME

当然,您可以将 CURTIME() 替换为您想要的任何时间(您可能需要添加一周中的某一天来打开和关闭,因为有些餐厅的营业时间不同,比如周日)

【讨论】:

【参考方案3】:

如果你可以使用 Postgres 9.4,你可以使用类似这样的东西-https://github.com/AndrewPashkin/pytempo

【讨论】:

以上是关于使用数据库、php、js 确定餐厅现在是不是营业(就像 yelp 一样)的主要内容,如果未能解决你的问题,请参考以下文章

存储营业时间/节假日

如何安排猫鼬某个地方的营业时间?

php判断时间范围

确定它是不是是 PHP 中字符串的结尾

如何使用当前时间计算某个位置的打开和关闭时间

看“负载均衡”技术如何指挥你的生活