Я бы использовал PHP, вставил новое время в таблицу, а затем выложил расписание для пользователя. Когда вы планируете расписание, выберите все выбранные пользователем действия и отобразите их в порядке времени
user
id | username | email | etc
33 | BillyBob | ... |
... etc ...
timetable
id | user_id | act_id
1 | 33 | 5
2 | 33 | 6
3 | 33 | 19
acts
id | start_time | end_time | title | description
5 | 2010-11-20 11:00 | 2010-11-20 13:00 | Smashing Tomatoes |
6 | 2010-11-20 12:00 | 2010-11-20 14:00 | Stray Dogs |
7 | 2010-11-21 11:00 | 2010-11-21 13:00 | Mister Googo |
....
19 | 2010-11-21 12:00 | 2010-11-21 14:00 | Reeses Pieces |
select t.*, a.title, UNIX_TIMESTAMP(a.start_time) as epoch_start, UNIX_TIMESTAMP(a.end_time) as epoch_end from timetable t join acts a on ( t.act_id = a.id ) where t.user_id = 33;
$timetable = array ();
while ( $rs = mysql_fetch_array ( $r, MYSQL_ASSOC ) )
{
foreach ( $timetable as $tt )
{
if ( $rs['epoch_start'] > $tt['epoch_start'] and $rs['epoch_start'] < $rs['epoch_end'] )
{
$rs['conflict'] = $tt['id'];
}
}
$timetable[$rs['id']] = $rs;
}
foreach ( $timetable as $toss => $tt )
{
echo $tt['title'];
if ( $tt['conflict'] )
{
$conflict = $timetable[$tt['conflict']];
echo "note: this time conflicts with {$conflict['title']}";
}
}
... Непроверенный код, но это суть. Я гарантирую, что там есть некоторые синтаксические и логические ошибки, но это концепция и один подход.
Я ушел от вещи time_id; это не очень помогло.