我想知道是否有人知道yelp如何确定哪些餐厅“现在开放”?我正在使用html / javascript / PHP开发类似的应用程序.我每天都会在我的数据库中有一个列,用逗号分隔的小时以“2243”格式(晚上10:43)写.例如,如果餐厅在午餐和晚餐时间开放,则可能是“1100,1400,1700,2200”.然后我会检查(使用js)当前时间是否属于当天的某个范围.我也希望能够确定一家餐馆是“今晚开放”,“开放晚了”等等,我想我会检查开放范围是否与某些范围重叠.
有一个更好的方法吗?特别是,如何在数据库中存储小时数,然后确定它们是否与给定的小时数重叠.
谢谢.
解决方法:
你肯定想重新设计数据库.将多个值放入单个列中是违反规范化规则的一个重大缺陷,并且会引起很多麻烦.单个列应始终包含一条信息.
您还应该使用正确的数据类型.不要把时间放在一个字符串中,因为你最终可能会以“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时要记住时区.