Правильная структура MySQL для временного диапазона для оптимизации запросов? - PullRequest
0 голосов
/ 30 марта 2012

У меня есть сценарий, в котором я хочу иметь возможность ВЫБРАТЬ строки из таблицы MySQL, но исключаю строки, в которых текущее время суток находится внутри временного диапазона.

Пример : «тихий» период для одного ряда - 10 вечера - 8:30 утра.Мой оператор SQL SELECT не должен возвращать эту строку, если текущее время сервера - после 22:00 или до 8:30.

Пример 2 : "период ожидания" равен NULL и игнорируется.

Пример 3 : создается новая строка с периодом тишины с 9:53 до 9:55.Если текущее время сервера находится в этом 2-минутном окне, строка не возвращает SELECT.

Мой вопрос : Какой формат данных вы бы использовали в базе данных и какВы пишете запрос?

Я думал о нескольких разных подходах (определяя start_time как один столбец и длительность как другой, определяя оба в секундах ... или используя штампы даты ... или что-то еще).Ни один из них не кажется идеальным и требует больших расчетов.

Спасибо!

1 Ответ

2 голосов
/ 31 марта 2012

Я бы сохранял даты начала и окончания как собственные поля MySQL TIME .Вам нужно будет рассмотреть диапазоны, охватывающие полночь, как два отдельных диапазона, но вы сможете запросить таблицу следующим образом: найти все текущие периоды тишины

SELECT DISTINCT name FROM `quiet_periods` 
WHERE start_time<=CURTIME() AND CURTIME()<=end_time

или найти все неактивные периоды тишины

SELECT name FROM quiet_periods WHERE name NOT IN (
  SELECT name FROM `quiet_periods` 
  WHERE start_time<=CURTIME() AND CURTIME()<=end_time
)

То есть с примерами данных

id  --  name        -- start_time -- end_time
 1  --  late_night  -- 00:00:00   -- 08:30:00
 2  --  late_night  -- 22:00:00   -- 23:59:59
 3  --  null_period --   NULL     --   NULL
 4  --  nearly_10am -- 09:53:00   -- 09:55:00

В 23:00 это будет возвращать

null_period
nearly_10am

из второго запроса.

В зависимости от производительности исколько у вас было строк, возможно, вы захотите реорганизовать второй запрос в JOIN и, возможно, также добавить соответствующие индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...