Ond*_*ták 3 language-agnostic algorithm
首先,我将此问题标记为语言不可知,但我使用的是PHP和MySQL.它本身不应该影响问题本身.
我正在创建一个应用程序,在整个星期显示某些节目的时间.每一个节目都是经常性的(每周一次)并且可能会有节目播出2天 - 例如.周日23:30开始,周一00:30结束.我正在存储节目的开头(星期几,星期一,星期二...... - 它不是确切的日期;时间)和持续时间.从来没有节目需要超过24小时.
如果新添加的节目与一些旧节目重叠,我的问题是验证.特别是如果涉及周日 - 周一节目.
如何在DB端和服务器端处理这些重复发生的事件?
tl;博士版我考虑过的东西
我的第一个想法是创建一些自定义验证算法,但它看起来太麻烦和复杂.并不是说我会抱怨复杂的手工制作的解决方案,但我很感兴趣,如果没有更基本的东西,我就会缺少.
想到的其他替代方案是将表结构更改为使用datetime(而不是"day of week"和"time"),并使用假的固定日期范围来存储数据.例如,所有星期一将设置为1970年1月5日,星期日将使用1970年1月11日.这个规则将有一个例外 - 如果有一些节目从星期日开始到星期一结束,它将被存储为1月12日这个解决方案允许比原始数据库更灵活地查询数据库,并且还可以简化对各个周之间重叠的节目的查询(因为我们可以直接在查询中进行比较).这个解决方案也存在一些缺点(例如,使用假日期可能会让人感到困惑).
这两种解决方案对我来说都是错误算法的味道,并且希望听到更有经验的开发人员的一些意见.
听起来你可以将每个节目的起始分钟存储为自本周开始以来的整数分钟数(10,080个可能的值).
然后,$a当持续时间从分钟开始的节目$dur_a将重叠,$b当且仅当
(10080 + $b - $a) % 10080 < $dur_a
例如,考虑一个节目从星期日晚上11点开始,另一个节目从星期一的12:30开始.这里$a == 10020和$dur_a == 120和$b == 30.(10080 + $b - $a) % 10080 == 90.这小于$dur_a,因此节目重叠.