1

好的...所以我有一个日历,在使用 CodeIgniter 构建的自定义 PHP 应用程序中,它从 MySQL 数据库中提取其条目。在包含条目数据的表中,有 3 个字段控制条目的日期 ( start_date )、时间 ( start_time ) 和持续时间 ( duration )。现在,随着最终用户将条目移动到新的日期和/或时间,系统需要检查这 3 个字段是否存在任何计划冲突。

以下是查询中使用的一些变量:

$request_entry_id // the id of the entry being moved
$request_start_date // the requested new date
$request_start_time // the requested new time
$request_duration // the duration of the entry being moved (will remain the same)
$end_time = ($request_start_time + $request_duration); // the new end time of the entry being moved

我用于检查日程冲突的查询是:

SELECT t.id
FROM TABLE t
WHERE t.start_date = '$request_start_date'
AND (j.start_time BETWEEN '$request_start_time' AND '$end_time'))
AND t.id <> $request_entry_id

上面的查询将检查与请求在同一日期和时间开始的任何条目。但是,我还想以最有效的方式检查以确保新请求不属于现有条目的持续时间(这是诀窍)。有什么建议么?提前致谢!

4

1 回答 1

2

如果您首先考虑没有冲突的条件,则更容易弄清楚逻辑:

新事件在现有事件开始之前结束,或者在现有事件结束之后开始。

对于有冲突,我们采取上述否定:

新事件在现有事件开始后结束,在现有事件结束之前开始。

在 SQL 中:

SELECT t.id
FROM TABLE t
WHERE t.start_date = '$request_start_date'
AND ('$end_time' > t.start_time AND '$request_start_time' < addtime(t.start_time, t.duration))
AND t.id <> $request_entry_id
于 2013-03-28T17:37:15.963 回答