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 идентично