MySQL / PHP查询 - 检查输入的开始/结束日期是否与Db中的现有日期范围重叠

时间:2011-09-20 11:03:23

标签: php mysql date range

我认为这应该比我的头脑更容易处理它 - 但我已经盯着它看了太久......

我为客户提供数据库驱动的竞赛引擎。他们可以登录并上传奖品照片,问题,开始/结束日期等。

一切都很棒 - 除了他们现在正在改变系统以允许一次只运行一个比赛。 因此,当有人试图添加一个新的,我需要验证它不会与数据库中已有的任何其他比赛重叠......

我的脑袋设法让我这么远:

$db->query('SELECT
    1 
FROM
    ' . DB_T_PREFIX . 'competition
WHERE
    (
        start_date <= "'.$fldStartDate->getValue().'"
    AND
        close_date >= "'.$fldStartDate->getValue().'"
    )
AND
    deleted = "0000-00-00 00:00:00"');

有人可以检查我是否应该覆盖任何重叠? 我很确定我需要更多的条件来解决这个问题,但是头脑已变得糊涂了...讨厌使用日期范围。

谢谢,

史蒂夫

2 个答案:

答案 0 :(得分:0)

绘画时间相关的东西通常很有帮助:

Timeline ( |------| is one competition; |.......| is "free" time)

Schedule:
...|-----------|.........|-------------------|......|--------|....>
         X                         Y                    Z
You want to create a new Competition:
...................|-------------|................................>
                         NEW

正如您所看到的,这个时间框架与Y竞赛相交叉。为了找到每个交叉竞争,请在DB(伪代码)中检查:

SELECT 1 FROM x WHERE
  start_date < new_start_date AND end_date > new start_date //intersect left
  OR
  start_date < new_end_date   AND end_date > new_end_date //intersect right

答案 1 :(得分:0)

我写了一个调度应用程序,就像那样做了。我使用了以下查询:

$query = "SELECT ... WHERE ((a.start_time < '$start' AND a.end_time > '$start') OR (a.start_time > '$start' AND a.end_time < '$end')) AND i.user_id=$userId";

$start是新活动的开始时间,$end是新活动的结束时间。 另外,请确保将$start$end格式化为'Y-m-d H:i:s'