使用数据库,php,js确定餐厅现在是否已打开(如yelp)

时间:2010-06-18 14:09:34

标签: php javascript sql

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

有更好的方法吗?特别是,如何在数据库中存储小时数,然后确定它们是否与给定的小时数重叠。

感谢。

3 个答案:

答案 0 :(得分:4)

您肯定想重新设计数据库。将多个值放入单个列中是违反规范化规则的一个重大缺陷,并且会引起很多麻烦。单个列应始终包含一条信息。

您还应该使用正确的数据类型。不要把时间放在一个字符串中,因为你最终可能会以“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时要记住时区。

答案 1 :(得分: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()(你可能想要为开放和关闭添加一周中的某一天,因为有些餐馆有不同的工作时间,星期日)

答案 2 :(得分:1)

如果您可以使用Postgres 9.4,您可以使用类似这样的内容 - https://github.com/AndrewPashkin/pytempo