跨24小时时段数据展示优化:单记录替代双记录方案咨询
跨天时段数据展示的单条记录实现方案
我正在开发一个按指定日期时段展示数据的项目,例如:每周一18:00至周二03:00展示数据。目前需创建两条记录实现该需求:一条为周一18:00至23:59,另一条为周二00:00至03:00。请问是否可通过单条记录实现此类跨天时段的需求?当前用于获取数据的SQL查询如下:
// PHP Variables $DayOfWeek = date('N'); $NowTime = date('H:i:s'); $NowDate = date('Y-m-d');-- MySQL Query SELECT RecordID, ClientImageName,FromDateTime,ToDateTime, Day1,Day2,Day3,Day4,Day5,Day6,Day7 FROM Promotions2017 WHERE ClientID = '".$ClientID."' AND DisplayID = '".$DisplayID."' AND '".$NowTime."' BETWEEN FromTime AND ToTime AND '".$NowDate."' >= FromDate AND '".$NowDate."' <= ToDate AND '".$DayOfWeek."' IN(Day1,Day2,Day3,Day4,Day5,Day6,Day7)
结论:可以用单条记录实现
现有SQL仅判断当天的星期几与时间区间,无法覆盖跨天场景。只需调整时间匹配逻辑,同时在单条记录中标记跨天涉及的星期几,就能实现需求。
核心思路
- 当
FromTime>ToTime时,判定为跨天时段(如18:00 > 03:00) - 跨天场景分两种匹配情况:
- 当前时间在
FromTime至23:59:59,且当天是时段的起始星期几 - 当前时间在00:00:00至
ToTime,且当天是时段的结束星期几
- 当前时间在
- 非跨天场景保持原有逻辑即可
修改后的SQL查询
替换原时间与星期几的判断条件,新增跨天场景的匹配逻辑:
SELECT RecordID, ClientImageName, FromDateTime, ToDateTime, Day1, Day2, Day3, Day4, Day5, Day6, Day7 FROM Promotions2017 WHERE ClientID = '".$ClientID."' AND DisplayID = '".$DisplayID."' AND '".$NowDate."' >= FromDate AND '".$NowDate."' <= ToDate AND ( -- 非跨天场景:正常匹配当天星期几和时间区间 (FromTime <= ToTime AND '".$NowTime."' BETWEEN FromTime AND ToTime AND '".$DayOfWeek."' IN(Day1, Day2, Day3, Day4, Day5, Day6, Day7)) OR -- 跨天场景:匹配起始日晚段或次日早段,同时对应星期几需存在 (FromTime > ToTime AND ( -- 情况1:当前是起始日,时间在FromTime到23:59:59 ('".$NowTime."' >= FromTime AND '".$DayOfWeek."' IN(Day1, Day2, Day3, Day4, Day5, Day6, Day7)) OR -- 情况2:当前是次日,时间在00:00:00到ToTime,且次日星期几在记录中 ('".$NowTime."' <= ToTime AND '".($DayOfWeek % 7 + 1)."' IN(Day1, Day2, Day3, Day4, Day5, Day6, Day7)) ) ) )
注:($DayOfWeek %7 +1)用于计算次日的星期数(因date('N')返回1-7,周日(7)的次日为周一(1))
单条记录配置示例
针对「每周一18:00至周二03:00」的需求,单条记录关键字段配置:
FromTime=18:00:00ToTime=03:00:00Day1=1(周一)、Day2=2(周二),其余Day字段留空或设为0
额外优化建议
- 防范SQL注入:现有代码直接拼接变量到SQL中存在风险,建议改用PDO预处理语句或MySQLi绑定参数。
- 简化星期字段:可将Day1-Day7合并为单个
WeekDays字段(如逗号分隔字符串1,2或整数位掩码),减少表结构冗余。
内容的提问来源于stack exchange,提问作者DCJones
相关产品推荐
相关产品推荐

