мне было интересно, знает ли кто, как визг определяет, какие рестораны «открыты сейчас»? Я разрабатываю аналогичное приложение, используя 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