我想知道是否有人知道yelp如何确定哪些餐馆“现在营业”?我正在使用html / javascript /php开发类似的应用程序。我每天都会在数据库中有一列,并以“ 2243”格式(晚上10:43 pm)写以逗号分隔的小时数。因此,例如,如果一家餐厅开门供应午餐和晚餐,则可能是“ 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使用时,请记住要牢记时区。