根据timeinterval从mySQL中选择

时间:2014-05-29 12:37:04

标签: mysql

所以...我的大脑出现故障 - 逻辑消失了,我感到沮丧!

我正在建造一个日历。我有一张约会表:

------------------------------------------------------------------------
| id | user_id | app_name  | app_start           | app_end             |
------------------------------------------------------------------------
| 1  | 3       | Meeting   | 2014-05-29 15:00:00 | 2014-05-29 17:00:00 |
------------------------------------------------------------------------

然后用户可以输入日期和时间,然后输入时间间隔。

让我们说用户选择2014-05-29,15:15并将时间间隔设置为+2小时。 这为我们提供了两个比较日期时间:

$start  =   '2014-05-29 15:15:00';
$end    =   '2014-05-29 17:15:00';

现在,我想在日历中选择所有约会"冲突"这两个日期时间。但是,不应选择以$ start结尾的约会,也不应选择以$ end开头的约会。

应该很容易,但我还没有把它钉死。我最终得到的问题是:

SELECT id, app_name
FROM appointments
WHERE user_id = ?
  AND ((app_start BETWEEN '$start' AND '$end' AND app_start != '$end')
  OR (app_end BETWEEN '$start' AND '$end')
  OR (app_start > '$start' AND app_end > '$end'))

所以我要问的是:我的查询应该如何?

编辑:

根据我的问题的答案,工作查询是:

SELECT id, app_name FROM appointments 
WHERE user_id = ? 
  AND ((app_start BETWEEN '$start' AND '$end' AND app_start != '$end') 
  OR (app_end BETWEEN '$start' AND '$end' AND app_end != '$start') 
  OR (app_start < '$start' AND app_end > '$end'))

2 个答案:

答案 0 :(得分:0)

冲突约会应该是以下之一

  1. 在指定的时间范围内开始预约。

    (app_start BETWEEN'$ start'AND'$ end'AND app_start!='$ end')

  2. 约会在给定的时间范围内结束。

    app_end BETWEEN'$ start'AND'$ end'

  3. 约会在此时间之前开始,在结束时间之后结束。在您的情况下,您使用了pp_start&gt;第一个条件已经涵盖'$ start'bu tit。现在您正在寻找在结束时间之前和结束之后开始的约会。

    (app_start&lt;'$ start'AND app_end&gt;'$ end')

    SELECT id,app_name FROM appointmentments WHERE user_id =?和 ((app_start BETWEEN'$ start'AND'$ end'AND app_start!='$ end')或(app_end BETWEEN'$ start'AND'$ end')或(app_start&lt;'$ start'AND app_end&gt;' $端'))

答案 1 :(得分:0)

这是查找冲突约会的简单方法:

SELECT id, app_name
FROM appointments
WHERE user_id = ?
  AND app_end > '$start'
  AND app_start < '$end'