vee*_*vee 3 javascript php sql
我想知道是否有人知道 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)
)
Run Code Online (Sandbox Code Playgroud)
然后,您可以轻松查看在给定时间营业的餐厅:
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
)
Run Code Online (Sandbox Code Playgroud)
如果您的时间段跨越午夜,则需要有两行 - 一行表示第一天,一行表示午夜 - “x”表示第二天。另外,从 GUI 中使用时请记住记住时区。