我们是一个广播电台,节目的节目网格中有开始和结束时间,分别在一周的特定日期和一年中的特定星期。我们有从星期六到星期日(星期六晚上11点至星期日凌晨1点)的通宵节目,还有安排在星期一,星期二和星期三进行的节目。
我们正尝试在特定时间向MySQL创建有关正在播放的节目的查询。我们当前的查询无法执行此操作。
我们如何构造一个查询或查询当前表,仅提供时间,一周中的某天,一年中的某周。是否需要更改表以包含更多信息?谢谢。
我们尝试了以下表构造和MySQL查询。
MySQL:
checked
PHP:
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;
样本数据: 表演于星期六晚上11点开始,于星期日凌晨1点结束
$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'";
对于给定的$ time = 00:12:00输入,$ dow =星期日,$ weeks = 52,这将返回空结果集,因为该节目在星期六开始。
答案 0 :(得分:0)
您的表(至少)有两个问题:
同时具有开始时间和结束时间,但是只有开始日期,这意味着您的节目在同一天开始和结束(例如,从过去的23点到1点的时间-一整个星期)。
使用字符串列表作为值不仅效率低下(如果没有很多行,可以原谅),但也会带来问题,例如使用%2%
查找第二周将匹配2
,12
,22
,依此类推。一种解决方法是在值的开头添加逗号,
,在值的末尾添加逗号,然后搜索%,2,%
(您必须添加,
,在数据中或使用concat()
进行查询时,否则将与第一个值或最后一个值都不匹配。
实际的解决方案是添加两个表:
shows
,但没有starts
,ends
,days
和weeks
shows_schedule
,其开始时间为和持续时间(而非结束时间)shows_schedule_weeks
,每周您可以在这里排一排给我点时间,我将添加一个示例。
答案 1 :(得分:0)
要保持您当前的架构,您可以通过以下方式更改查询:
$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小时的节目(即跨越多天)。为了支持这种情况,您必须更深入地更改架构。