Twój kod nie uwzględnia różnicy w latach (między sty 2014 a lut 2016 jest 12 + 11 + 1 miesięcy (24)).
ilosc_miesiecy = (rok_a - rok_b) * 12 + (miesiac_w_roku_a - miesiac_w_roku_b);
Wzór prawdziwy dla przypadku gdy miesiące są zapisywane w przedziale 0 - 11.
Testowałem wzór na poniższym kodzie w języku C#. Kwestia przerobienia go do SQL-a.
Kopiuj
using System;
namespace C
{
class Program
{
static void W(int t)
{
Console.WriteLine(t.ToString());
}
static void Main(string[] args)
{
W(Diff(new Dt() { Month = 0, Year = 2000 }, new Dt() { Month = 0, Year = 2000 })); // 0
W(Diff(new Dt() { Month = 0, Year = 2000 }, new Dt() { Month = 1, Year = 2000 })); // 1
W(Diff(new Dt() { Month = 1, Year = 2000 }, new Dt() { Month = 0, Year = 2000 })); // -1
W(Diff(new Dt() { Month = 0, Year = 2000 }, new Dt() { Month = 11, Year = 1999 })); // 1
W(Diff(new Dt() { Month = 11, Year = 1999 }, new Dt() { Month = 0, Year = 2000 })); // -1
W(Diff(new Dt() { Month = 6, Year = 2000 }, new Dt() { Month = 8, Year = 2000 })); // -2
W(Diff(new Dt() { Month = 8, Year = 2000 }, new Dt() { Month = 6, Year = 2000 })); // 2
W(Diff(new Dt() { Month = 0, Year = 2000 }, new Dt() { Month = 11, Year = 2000 })); // -11
W(Diff(new Dt() { Month = 0, Year = 2000 }, new Dt() { Month = 0, Year = 2001 })); // -12
Console.Read();
}
static int Diff(Dt a, Dt b)
{
return (a.Year - b.Year)*12 + (a.Month - b.Month);
}
public class Dt
{
public int Month { get; set; }
public int Year { get; set; }
}
}
}