0

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

我们有一张安排每周活动的桌子。表的每一行都有一个唯一的 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;

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

这在纸上似乎很容易,我已经用日期范围(实际日期字段)完成了它,但我无法让它正常工作。提前感谢您的帮助,如果您需要进一步说明,请告诉我。

4

2 回答 2

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))))
于 2013-10-09T21:53:21.260 回答
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 语句看看我们是否正在遍历数周
  • 条件拉入范围(不等于之间的所有事件,注意周末
  • 最后两个 OR 条件拉入特定的开始/结束日期/时间事件

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

于 2013-10-09T22:51:53.430 回答