Если я правильно понял вашу проблему, лучше всего решить ее, используя Принцип исключения включений .
Скажите, если ваша дата начала где-то в 2008 году, а дата окончания - в 2010:
NDAYS(start, end) * coeff_2008
- NDAYS(2009, end) * coeff_2008 + NDAYS(2009, end) * coeff_2009
- NDAYS(2010, end) * coeff_2009 + NDAYS(2010, end) * coeff_2010
Где Ndays вычисляет количество дат в интервале (TotalDays плюс один день).
Нет необходимости специально обрабатывать високосные годы или вычислять 31 декабря.Детали, которые вы можете проработать в цикле for, проходящем январь каждого года в промежутке.