rstJkee
@rstJkee

Попадает время в промежуток между двумя time или нет?

Есть таблица shop с двумя полями: open_time и close_time. Необходимо узнать открыт сейчас магазин или нет

Я пробовал через
localtime between open_time and close_time
но он судя по всему просто свапает местами, если open_time больше close_time

То есть нужно обрабатывать случай
open_time = 22:00
close_time = 5:00

Как это можно обработать?
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker
Программист, энтузиаст
Да как-как? как обычно
localtime >= open_time and localtime < close_time
UPD:
Не сразу понял в чем проблема.
Речь, похоже, о заведениях типа ночных клубов, которые работают, скажем, с 22:00 до 05:00 и нужно понять попадает ли какое-то время в этот интервал, если два времени оказались по разную сторону от полуночи.
Тут спасёт сложное условие:
SELECT *
FROM shop
WHERE
(open_time <= close_time) AND (localtime BETWEEN open_time AND close_time) OR
(open_time > close_time) AND NOT (localtime BETWEEN close_time AND open_time)

Это замечательно работает, если ваши магазины работают каждый день по одному графику, а если нет, то нужно строить расписание на неделю. Это доволно быстро работает, если хранить расписание в отдельной таблице в виде нтервалов работы в секундах от начала недели и ссылку (многие к одному) на учреждение.

UPD2: Перенесу, пожалуй, сюда и пример с недельным расписанием из своего комментария.

Интереснее когда график работы магазина разный в выходные и будни, причем, скажем, на выходных магазин открыт в полночь.
Ну, к примеру, пн-пт - 10:00-23:00 а сб-вс - 10:00-01:00.
Тут вообще интересно. Фактически магазин не работает в суботу с полуночи до часу ночи, но работает в понедельник с полуночи до часу ночи.
В таких случаях расписание лучше задавать набором интервалов в часах, минутах или, обычно, в секундах от полуночи понедельника.
В часах проще показывать на примере.
0-1, 10-23 - понедельник
34-47 - вторник
и т.д.
По-хорошему должен быть специальный бинарный тип данных, способный хранить такие интервалы эффективно и индексировать их.
Очевидно. что для выше изложенного графика таких интервалов надо около 7+2 - по одному основному на каждый день, час после полуночи понедельника, и час после полуночи воскресенья.
Итого 9 интервалов на магазин, если без перерывов. С обеденными перерывами будет 16 интервалов на магазин. В любом случае не критично. Просто нужно задавать реальное расписание магазина в формализованной форме (какой-то формулой) прямо в записи об этом магазине, а в таблицу с интервалами просто кэшировать развернутое расписание при апдейте формулы.
У нас точно также интервалами с кэшированием в отдельной таблице было устроено расписание ВУЗа и всё работало мгновенно.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Тут надо сначала смысл разобрать. Вот как ты себе понимаешь что магазин открылся в 22.00 а закрылся в 5.00 ?
Закрылся в 5.00 утра следующего дня? Работал всего 7 часов. Это один кейс. А другой кейс - если свапнуть время - то получается что работал 15 часов. Выводы? Свапать нельзя никак.

А вот когда смысл проверки мы поймем - тогда можно и код писать. В крайнем случае - хранимую функцию написать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы