MySQL Query для поиска записи между временем начала / окончания в течение дня недели - PullRequest
0 голосов
/ 31 декабря 2018

Мы радиостанция с сеткой передач, в которой есть время начала и окончания, в определенный день недели, в определенные недели года.У нас есть показы, которые запускаются в ночь с субботы на воскресенье (с 11 вечера по субботу - 1 час по воскресеньям), а также шоу, запланированные на понедельник, вторник, среду.

Мы пытаемся создать запрос к MySQL о том, что показываютнаходится в эфире в определенное время.Наш текущий запрос не способен на такую ​​вещь.

Как мы можем построить запрос или запросы к текущей таблице, предоставляя только время, день недели, неделю года.Нужно ли менять таблицу, чтобы включить в нее больше информации?Спасибо.

Мы попробовали следующую конструкцию таблицы и запрос MySQL.

MySQL:

CREATE TABLE `shows` (
    `id`        tinyint(4) NOT NULL,
    `name`      varchar(255) NOT NULL COMMENT 'Program Name',
    `starts`    time NOT NULL COMMENT 'Starting Time',
    `ends`      time NOT NULL COMMENT 'Ending Time',
    `duration`  smallint(6) NOT NULL COMMENT 'Length in seconds',
    `days` set('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') NOT NULL COMMENT 'Starting Day of the Week',
    `weeks`     set('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53') DEFAULT NULL COMMENT 'Weeks of the Year',
    `active`     tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Active Program'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

PHP:

$time = date("H:i:s"); // current time
$dow = date("l"); // current Day of Week
$week = date("W");// current week

$query = "SELECT id, name, starts, ends, duration, days, weeks, active
          FROM shows WHERE starts < $time AND ends > $time
          AND FIND_IN_SET('$dow', days)
          AND FIND_IN_SET('$week', weeks)
          AND active = '1'";

Пример данных: Шоу начинается в субботу в 23:00 и заканчивается в воскресенье 1 утра

{
    "id": "123",
    "name": "Overnight Show",
    "starts": "23:00:00",
    "ends": "01:00:00",
    "duration": "7200",
    "days": "Saturday",
    "weeks": "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53",
    "active": "1"
}

Для данного ввода$ time = 00:12:00, $ dow = воскресенье, $ days = 52 - возвращается пустой набор результатов, потому что шоу начинается в субботу.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

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

$time = date("H:i:s"); // current time
$dow = date("l"); // current day of Week
$dow_ystd = date("l", time() - 60*60*24); // day of Week of yesterday
$week = date("W");// current week

$query = "SELECT id, name, starts, ends, duration, days, weeks, active
          FROM shows WHERE

          (
            ( (ends > starts) AND (FIND_IN_SET('$dow', days)) AND (starts <= '$time') AND (ends >= '$time') )
            OR
            ( (ends <= starts) AND (FIND_IN_SET('$dow_ystd', days)) AND (ends > '$time') )
          )
        AND FIND_IN_SET('$week', weeks)
        AND active = '1'";

Имейте в виду, что этот не обрабатывает показы в течение более 24 часов (т.е.охватывающих несколько дней).Для поддержки этого сценария вам придется более глубоко изменить схему.

0 голосов
/ 31 декабря 2018

Ваша таблица имеет (как минимум) две проблемы:

  • Наличие времени начала и окончания, но только дня начала, означает, что ваше шоу начинается и заканчивается в один и тот же день (вНапример, с субботы в 23 до субботы в 1 - в прошлом или в течение целой недели.

  • Использование списка строк в качестве значения не только неэффективно (чтоможет быть прощен, если строк не так много), но также вызывает проблемы, например, поиск второй недели с %2% будет соответствовать 2, 12, 22 и так далее.Обходным путем для этого может быть добавление запятой , в начале значения и другого в конце значения и поиск %,2,% (необходимо добавить , в данных или во времязапрос с concat(), поскольку в противном случае он не будет совпадать ни с первым, ни с последним значением).

Фактическим решением будет добавить две таблицы:

  • Ваш текущий shows, но без starts, ends, days и weeks
  • shows_schedule со временем начала и продолжительностью (не время окончания)
  • shows_schedule_weeks где у вас будет один ряд в неделю

Дайте мне немного времени, и я добавлю пример.

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