для PHP> = 5,3
$d1 = new DateTime("2009-09-01");
$d2 = new DateTime("2010-05-01");
var_dump($d1->diff($d2)->m); // int(4)
var_dump($d1->diff($d2)->m + ($d1->diff($d2)->y*12)); // int(8)
DateTime :: diff возвращает DateInterval объект
Если вы не работаете с PHP 5.3 или выше, я думаю, вам придется использовать метки времени Unix:
$d1 = "2009-09-01";
$d2 = "2010-05-01";
echo (int)abs((strtotime($d1) - strtotime($d2))/(60*60*24*30)); // 8
Но это не очень точно (не всегда 30 дней в месяц).
И последнее: если эти даты взяты из вашей базы данных, используйте эту СУБД, а не PHP.
Редактировать: Этот код должен быть более точным, если вы не можете использовать DateTime :: diff или вашу СУБД:
$d1 = strtotime("2009-09-01");
$d2 = strtotime("2010-05-01");
$min_date = min($d1, $d2);
$max_date = max($d1, $d2);
$i = 0;
while (($min_date = strtotime("+1 MONTH", $min_date)) <= $max_date) {
$i++;
}
echo $i; // 8