查询一系列日期和时间

时间:2013-10-09 21:16:57

标签: php sql algorithm range

我希望能够计算出某个范围是否在一个范围内并返回所有结果。

我们有一张表已安排每周活动。表格的每一行都有唯一的ID,日期编号和小时编号。

id (auto int) | dayNumber (int from 0 to 6) | hourNumber (int from 0 to 23) 

根据此表,我们可以确定何时应该在计划中发生事件。例如,dayNumber = 2和hourNumber = 3的条目意味着事件安排在星期二凌晨3点。

我发现困难的部分是我需要运行查询来获取一系列预定事件。所以我将传递最小dayNumber和hourNumber以及最大dayNumber和hourNumber。我的预期结果将是该范围内的每个匹配条目。

更简单的情况是最小值小于最大值。例如(在PHP中),

$minimumDayNumber = 1; $minimumHourNumber = 3;
$maximumDayNumber = 5; $maximumHourNumber = 6;

当我想要搜索周六到周二的范围时,它变得更复杂。为此,变量看起来像这样:     $ minimumDayNumber = 6; $ minimumHourNumber = 3;     $ maximumDayNumber = 2; $ maximumHourNumber = 6;

使用这些输入,我需要查询数据库并查找该范围内的所有条目。必须有一个好的算法来构造查询或一个好的查询来直接做到这一点。

这在纸上看起来很简单,我已经用日期范围(实际日期字段)完成了,但我无法让它正常工作。提前感谢您的帮助,如果您需要进一步说明,请与我们联系。

2 个答案:

答案 0 :(得分:1)

试试这个

where (($maximumDayNumber > $minimumDayNumber and (dayNumber+hourNumber/24) >= ($minimumDayNumber+$minimumHourNumber/24) and (dayNumber+hourNumber/24) <= ($maximumDayNumber+$maximumHourNumber/24))
   or ($maximumDayNumber < $minimumDayNumber and ((dayNumber+hourNumber/24) <= ($minimumDayNumber+$minimumHourNumber/24) OR (dayNumber+hourNumber/24) >= ($maximumDayNumber+$maximumHourNumber/24))))

答案 1 :(得分:1)

这会有用吗?

SELECT * FROM activities
WHERE IF( $minDayNum = $maxDayNum,
    ( dayNumber = $minDayNum AND hourNumber >= $minHourNum AND hourNumber <= $maxHourNum ),
    (
        IF( $minDayNum > $maxDayNum,
            ( dayNumber > $minDayNum AND dayNumber < $maxDayNum ),
            ( dayNumber > $minDayNum OR dayNumber < $maxDayNum )
        )
        OR ( dayNumber = $minDayNum AND hourNumber >= $minHourNum )
        OR ( dayNumber = $maxDayNum AND hourNumber <= $maxHourNum )
    )
)

原谅橡皮鸭:

  • 第一个IF会检查日期是否相同
  • 如果是这样,一个简单的where子句将缩小当天的工作时间
  • 如果没有,我们会转到另一个if语句,看看我们是否正在经历数周
  • 条件在范围内拉出所有事件 em ,意识到周结束
  • 最后两个OR条件引入特定的开始/结束日期/时间事件

我没有嘲笑任何东西,让我知道它是如何运作的。