datetime — освобождает от привязки к текущей временной зоне сервера. допустим вы храните все даты в предопределенной временной зоне (например GMT), тогда при переносе базы на другой сервер — даты не пострадают. 
timestamp — привязан к временной зоне сервера. если изменить временную зону сервера — то данные в поле изменяться соответственно. 
код для проверки:
SET time_zone = '+00:00'; #ставим зону в GMT
CREATE TABLE `test_date_time` (  `dateime` DATETIME ,  `timestamp` TIMESTAMP ) ; # создаем таблицу
INSERT INTO `test_date_time`(`dateime`,`timestamp`) VALUES ( '2013-04-24 21:36:03','2013-04-24 21:36:03');  # вносим идентичные даты в оба поля
SET time_zone = '+05:00'; # меняем зону
SELECT * FROM test_date_time; # проверяем как выгдяет выборка
я за datetime.
функции манипуляции датами работают с timestamp и datetime идентично