本文详解如何结合 php 时间函数与 mysql 查询,动态筛选出最接近当前时间的电台节目的“当前/即将播出”信息(含今日未开始、跨日顺延逻辑),避免硬编码、提升实时性与可维护性。
在构建电台类网站时,主页常需精准展示“正在播出”或“即将播出”的节目(即当前时间点之后、时间上最近的一档)。但问题在于:数据库仅存储了星期几(DAY: 0–6)和每日固定时段(START: '20:00', END: '21:00'),并未保存具体日期,因此无法直接用 NOW() 做标准时间比较。若简单按 DAY >= $currentDay 排序,会遗漏“今天已过时、但明天同一时段更近”的场景(例如当前是周二 22:30,而周二所有节目已结束,但周三 19:00 的节目比周四 18:00 更近)。
核心策略是:为每条记录动态生成一个“本周内最可能发生的候选时间点”,再计算其与当前时间的绝对差值,取最小者。由于节目按周循环,我们只需考虑从今天起未来 7 天(含当天)的 7 个可能时间点,并从中选出时间上最近的一个。
但注意:原答案中 TIMESTAMP(CURRENT_DATE(), START) 存在严重缺陷——它强制将所有节目绑定到今天,导致周三的节目在周一查询时仍被算作“今天 19:00”,逻辑错误。正确做法是:根据 DAY 字段推算出该节目在“未来 7 天内首次出现的具体 datetime”。
以下是推荐的健壮实现方案:
$currentDay = (int)date('w'); // 0=Sunday, 1=Monday...
$currentTime = date('H:i');
// 构造“未来7天内,每个DAY对应的最早完整datetime”
$now = new DateTime();
$now->setTime((int)substr($currentTime, 0, 2), (int)substr($currentTime, 3, 2));
$minDiff = PHP_INT_MAX;
$bestRecord = null;
// 查询全部待选节目(STATUS = 0)
$sql = "SELECT * FROM `puzzle` WHERE `STATUS` = 0 ORDER BY `DAY`, `START`";
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$programDay = (int)$row['DAY'];
$programTime = DateTime::createFromFormat('H:i', $row['START']);
// 计算该节目本周内首次发生的时间:若 DAY >= 当前星期几,可能是今天或之后;否则是下周
$daysOffset = ($programDay >= $currentDay)
? $programDay - $currentDay
: 7 - $currentDay + $programDay;
$candidate = clone $now;
$candidate->modify("+$daysOffset days");
$candidate->setTime($programTime->format('H'), $programTime->format('i'));
// 若该时段在今天已过去(如当前 22:30,节目 20:00),则顺延到下一周对应时间
if ($candidate <= $now) {
$candidate->modify('+7 days');
}
$diff = $candidate->getTimestamp() - $now->getTimestamp();
if ($diff < $minDiff) {
$minDiff = $diff;
$bestRecord = $row;
$bestDateTime = $candidate;
}
}若坚持纯 SQL 解决(需 MySQL 8.0+ 支持窗口函数或复杂表达式),可借助 DATE_ADD 和模运算模拟“下一个有效日期”:
SELECT
*,
TIMESTAMP(
DATE_ADD(CURDATE(), INTERVAL
CASE
WHEN `DAY` >= WEEKDAY(CURDATE()) + 1 THEN `DAY` - (WEEKDAY(CURDATE()) + 1)
ELSE 7 - (WEEKDAY(CURDATE()) + 1) + `DAY`
END DAY
),
`START`
) AS scheduled_time
FROM `puzzle`
WHERE `STATUS` = 0
HAVING scheduled_time > NOW()
ORDER BY ABS(TIMESTAMPDIFF(SECOND, NOW(), scheduled_time))
LIMIT 1;⚠️ 注意:WEEKDAY() 返回 0=Monday,需与你的 DAY 字段对齐(若你用 date("w") → 0=Sunday,则应改用 DAYOFWEEK(CURDATE())-1)。
if ($bestRecord) {
echo "";
echo "{$bestRecord['USERNAME']}
";
echo "Starts at {$bestRecord['START']} on " .
['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][$bestRecord['DAY']] .
" (" . $bestDateTime->format('M j, H:i') . ")";
echo "";
}此方案兼顾准确性、可读性与扩展性,是电台/播客类网站时间驱动型展示的推荐实践。
# mysql
# php
# 编码
# 大数据
# ai
# amd
# sql
# date
# timestamp
# 循环
# 并发
# 数据库
# 首次
# 未来
# 下周
# 更近
# 本周内
# 则是
# 只需
# 可选
# 可将
# 如需
相关文章:
股票网站制作软件,网上股票怎么开户?
,网站推广常用方法?
建站之星如何开启自定义404页面避免用户流失?
,怎么用自己头像做动态表情包?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何设计高效校园网站?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
北京网站制作网页,网站升级改版需要多久?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
平台云上自助建站如何快速打造专业网站?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
css网站制作参考文献有哪些,易聊怎么注册?
Swift中循环语句中的转移语句 break 和 continue
如何选择高效稳定的ISP建站解决方案?
如何挑选最适合建站的高性能VPS主机?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
定制建站哪家更专业可靠?推荐榜单揭晓
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
广东企业建站网站优化与SEO营销核心策略指南
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
网站制作员失业,怎样查看自己网站的注册者?
北京制作网站的公司,北京铁路集团官方网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
广州商城建站系统开发成本与周期如何控制?
如何在Windows环境下新建FTP站点并设置权限?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星如何快速解决建站难题?
已有域名如何免费搭建网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
宝塔建站无法访问?如何排查配置与端口问题?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
C++中引用和指针有什么区别?(代码说明)
建站之星会员如何解锁更多建站功能?
如何在阿里云香港服务器快速搭建网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何有效防御Web建站篡改攻击?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
实现点击下箭头变上箭头来回切换的两种方法【推荐】
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
微信小程序 五星评分(包括半颗星评分)实例代码
深圳网站制作培训,深圳哪些招聘网站比较好?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
如何配置WinSCP新建站点的密钥验证步骤?
淘宝制作网站有哪些,淘宝网官网主页?
*请认真填写需求信息,我们会在24小时内与您取得联系。