определить, открыт ли ресторан в данный момент (например, yelp), используя базу данных, php, js

мне было интересно, знает ли кто, как визг определяет, какие рестораны «открыты сейчас»? Я разрабатываю аналогичное приложение, используя html / javascript / php. я собирался иметь столбец в моей базе данных на каждый день, с запятыми, разделенными на часы, записанные в формате «2243» (22: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» на следующий день. Кроме того, не забудьте учитывать часовые пояса при использовании графического интерфейса.

У меня будет таблица с именем 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 () в любое время (вы можете добавить день недели для открытия и закрытия, так как в некоторых ресторанах разное время, например, воскресенье)

Если вы можете использовать Postgres 9.4, вы можете использовать что-то вроде этого: https://github.com/AndrewPashkin/pytempo