Będziesz musiał wyciągnąć czas trwania zadania (ilość godzin od startu do końca), znać godzinę startu tego "specjala" i każdej po nim wstawionego odpowiednio "przesuwać daty oraz godziny". Posługując się Twoim przykładem...
1 a a1 2009-10-20 12:00 2009-10-20 15:00
2 b b1 2009-10-20 15:00 2009-10-20 19:00
3 c c1 2009-10-20 19:00 2009-10-20 20:00
Wiemy, że C dostał specjala i startuje o 12 zamiast A. Wstawiamy go tam z czasem 12.00 do 13 (bo C trwa godzinę, od 19 do 20). Teraz WSZYSTKIE po nim począwszy od tego z jakim go zamieniliśmy, czyli od A mają sprawdzamy czas trwania i dostosowywane są do zmienionego rozkładu. A więc:
A trwa 3 godziny (12-15), więc od 13.00 (czas końca specjala) do 16.00
B trwa 4 godziny(15-19), więc od 16.00 (koniec A) do 20.
Zmianom ulegają TYLKO zadania począwszy od tego, które zostało zastąpione do tego przed specjalnym. Na przykładzie nieco szerszym:
1 a a1 12:00 - 15:00
2 b b1 15:00 - 19:00
3 c c1 19:00 - 20:00
4 c c2 20.00 - 21.00
5 b b2 21.00 - 22.00
Gdy 4 ma zacząć się o 15.00...
4 trwa godzinę, a za sobą ma 5, zaś o 15.00 zaczyna się 2, co sprawia, że do korekty godzin kwalifikują się 2 i 3 (tylko one mają czasy startu od 15.00 do starego startu zadania 4 czyli 20.00).
Jako że różnica to godzina, więc wszystkim złapanym robimy przesunięcie daty startu i końca zadania o godzinę, zaś priorytetowi stat ustawiamy na ową godzinę i dodajemy czas trwania.
Da nam to:
1 a a1 12:00 - 15:00
4 c c2 15.00 - 16.002 b b1 16:00 - 20:003 c c1 20:00 - 21:00 5 b b2 21.00 - 22.00
Teraz widzisz na przykładzie co się dzieje? Robisz zapytanie do bazy, które zwraca Ci w wyniku rekordy z datami i czasami pomiędzy startem priorytetu a startem tego zadania gdyby było robione normalnie i w nich dodajesz do startu i końca czas trwania zadania priorytetowego. To jest wszystko co musisz zrobić

EDIT: @ Webdice. Jak widzisz w przykładzie, to nie tyle 2 sąsiednie rekordy... Jeśli użyje linków w stylu "Wyżej", "Niżej" to mu wystarczy tylko zmiana czasu w rekordzie priorytetu i tym przed nim. Gdy posłużyłby się "drag&drop", to rozwiązanie jakie przedstawiłem obejmie więcej niż 2 rekordy zapewne. Czyli obejmuje to nie tyle sąsiednie 2 rekordy, tylko rekordy
zawsze przed tym priorytetowym. Nigdy po nim następujące.
EDIT2: Pamiętaj, że wybrana przez Ciebie godzina może być nieosiągalna (może trwać inne zadanie). Albo przerywasz je i kończysz później (w bazie zrobisz mały bajzel lub będziesz musiał zmienić jej strukturę by na to pozwalała), albo zaczniesz priorytet gdy skończy się trwające wtedy zadanie (rozsądniejsze). Twój pomysł z niżej, wyżej sugeruje podejście drugie.