Какую схему SQL вы бы предложили для хранения часов и праздников, и какой запрос проверить, открыт ли ресторан? Прямо сейчас у меня есть это:
CREATE TABLE hours (
"restaurant" integer NOT NULL REFERENCES restaurants ON DELETE CASCADE,
"dow" integer NOT NULL,
"open" time NOT NULL,
"close" time NOT NULL
);
CREATE FUNCTION is_open(r integer) RETURNS boolean AS $$
DECLARE
h record;
t time;
BEGIN
SELECT open, close INTO h
FROM hours WHERE restaurant = r AND dow = EXTRACT(dow FROM now());
IF NOT FOUND THEN
RETURN false;
END IF;
t := current_time;
IF h.close <= h.open THEN
RETURN (t < h.close OR t > h.open);
ELSE
RETURN (t > h.open AND t < h.close);
END IF;
END;
$$ LANGUAGE plpgsql;
Но на самом деле это не работает, потому что, например, ресторан может быть открыт до 2:00 утра, после чего мне нужно будет проверить предыдущий dow
.
Чтобы все было немного сложнее, я должен иметь дело с праздниками:
CREATE TABLE holidays (
"restaurant" integer NOT NULL REFERENCES restauraunts ON DELETE CASCADE,
"day" date NOT NULL
);
Что имеет ту же проблему - если ресторан открыт с 15:30 до 2:00, это означает, что они также закрыты для блока с полуночи до двух.
Мне не удалось обернуть голову, чтобы найти чистое, элегантное решение для этого (несколько грязных приходили и уходили). Мне нужно пойти погулять и вернуться к нему - тем временем я решил, что я позволю вам, ребята, покончить с этим.