php - MySQL查询查找一周内的开始/结束时间之间的记录

标签 php mysql datetime

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

示例数据: 演出于周六晚上 11 点开始,周日凌晨 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 = Sunday、$weeks = 52 的给定输入,这将返回空结果集,因为节目从星期六开始。

最佳答案

为了保持当前架构,您可以这样更改查询:

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

关于php - MySQL查询查找一周内的开始/结束时间之间的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981501/

相关文章:

python - 为什么 python 的 datetime.isocalendar() 和 datetime.year 不同?

php - 对具有最多相似标签的帖子进行排序

sql - 通过linux使用mysqldump导出时将数据库名称添加到sql文件中

php - 当我检查代码时不断出现语法错误

Mysql2::错误:此 MySQL 版本不允许使用的命令:LOAD DATA LOCAL INFILE

java - 如何在不停止mysql服务器的情况下对mysql数据库进行数据库备份

php - Google Calendar API 日期时间

mysql - 时间戳 vs 日期时间 vs int - 有和没有索引 - 测试

php - 优化 codeigniter 查询、Join 或 Where

php - 如何使用 php 使用数据库信息动态更新页面