繁体   English   中英

MySQL查询以查找一周中某天的开始/结束时间之间的记录

[英]MySQL Query to find record between start/end time within day of week

我们是一家广播电台,节目的节目网格具有在每年的特定日期,一年中的特定星期开始和结束时间。 我们有从星期六到星期日(星期六晚上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'";

样本数据:

{
    "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 =星期日,$ weeks = 52,这将返回空结果集,因为该节目在星期六开始。

您的表有(至少)两个问题:

  • 具有开始时间和结束时间,但只有开始日期,这意味着您的节目在同一天开始和结束(例如,过去23周到1周1周或整个一周)。

  • 使用字符串列表作为值,不仅效率低(可如果没有多行被原谅),但也带来了问题,例如寻找第二个星期%2%将匹配21222和以此类推。 一种解决方法是在值的开头添加一个逗号,在值的末尾添加另一个,然后搜索%,2,% (您必须在数据中或查询期间添加, concat() ,因为否则它将不匹配第一个或最后一个值)。

实际的解决方案是添加两个表:

  • 您当前的shows ,但没有startsendsdaysweeks
  • 包含开始时间和持续时间 (而非结束时间)的shows_schedule
  • shows_schedule_weeks ,每周您将有一行

给我一些时间,我将举一个例子。

为了保持您当前的架构,您可以通过以下方式更改查询:

$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小时 (即跨越数天)的节目 为了支持这种情况,您必须更深入地更改架构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM