我有一个由 event_id、event_name、event_start_date 和 event_end_date 组成的“事件”表。
我遇到的问题是,在插入新事件时,我需要检查在新指定的新事件的开始日期和结束日期之间是否没有以前的事件。
event_to_date 和 event_form_date 之间不能有两个事件。
我正在使用 PHP 和 MySql。
您应该使用 SQL 检查将发生冲突的事件数:
<?php
// do your mysql connection
// count collided events
$sql = 'SELECT COUNT(*) as count FROM events WHERE event_start_date <= "'.
mysql_real_escape_string($new_event_end_date).'" AND event_end_date >= "'.
mysql_real_escape_string($new_event_start_date).'"';
$result = mysql_query($sql);
if (($row = mysql_fetch_assoc($result)) != FALSE) {
if ($row['count'] == 0) {
// insert the event normally
} else {
trigger_error('Error: There are '.$row['count'].' event(s) within this period.');
}
} else {
trigger_error('Unknown server error: '.mysql_error());
}
?>
本质上,您正在寻找重叠,这是一种伪类,其中 Candidate_X 是传入数据,existing_Y 是您的数据库中的数据。
解决方案将取决于您存储日期的字段类型。
毫无疑问,这可以改进,也许使用 BETWEEN 等。
SELECT ID from events WHERE
(candidate_from < existing_to
AND
candidate_to > existing_to)
OR
(candidate_to > existing_from
AND
candidate_to < existing_to)
如果这产生任何结果,那么这意味着您的数据库中有一些东西会重叠,因此您可以返回事件的 ID。
顺便说一句,这未经测试。