Holen Sie sich den tatsächlichen Monat Unterschied zwischen zwei date

Ich arbeite mit seltsamen Fragen in SQL, ich möchte den tatsächlichen Monat Unterschied zwischen zwei data zu finden, zum Beispiel

StartDate = '1-1-2013' EndDate = '4-30-2013' 

Hier will ich das Ergebnis 4 nicht 3 sein

 select datediff(mm, '1-1-2013', '4-30-2013') 

Diese Abfrage wird mir Ergebnis 3 aber tatsächlichen Ergebnis ist 4. Kann mir jemand helfen, auf diesem?

Nicht ganz sicher, ob dies hilft, aber hier ist mein stab auf sie:

 declare @date1 datetime = '2013-01-01', @date2 datetime = '2013-04-30' select Cast(Round(Cast(DATEDIFF(DD,@date1, @date2) as decimal(5,2)) / 30, 1) as int) as Months 

Was du fragst, ist nicht so einfach wie es zuerst erscheint. Ein offensichtlicher path wäre, um einen Tag zu Ihrem Enddatum hinzuzufügen, bevor Sie den Verabredung. Dies würde dann 1 Jan bis 1 Mai tun, was als vier Monate gemeldet werden würde.

Allerdings müssen Sie prüfen, ob es Toleranzen gibt; zum Beispiel, sollte 1 Jan bis 29 Apr als vier Monate betrachtet werden, oder ist das noch drei Monate? Offensichtlich hängt das stark von dem Kontext ab, in dem Sie diese data verwenden.

Bitte versuchen Sie, 01-01-2013 und 04-30-2013 anstatt dessen hinzuzufügen, was Sie hier hinzugefügt haben

Also Abfrage wird wie unten sein

 select datediff(mm, '1-1-2013', '4-30-2013') 

Vielen Dank Vasanthan

Wie andere schon erwähnt haben, ist das Ergebnis absolut richtig: 3 Monate und 29 Tage.

Sie können natürlich überprüfen, ob das date im Enddatum das letzte date des Monats ist und eine Anpassung vornehmen, um das gewünschte Ergebnis zu erzielen:

 DECLARE @START DATETIME, @END DATETIME SELECT @START = '2014-01-01', @END = '2014-04-30' SELECT @START, @END SELECT DATEDIFF(MONTH, @START, CASE WHEN MONTH(DATEADD(DAY, 1, @END)) > MONTH(@END) THEN DATEADD(DAY, +1, @END) ELSE @END END) 

Nicht sicher über die performance des Beispiels (Sie sind frei, mit ähnlichen Ideen zu experimentieren), aber was es tut, ist der letzte fehlende Tag, um die 4-Monats-Differenz zu produzieren, wenn das Enddatum den letzten Tag des Monats darstellt.

Nun, ich bin mit den anderen hier einverstanden, dass dies eine seltsame Sache zu tun ist, aber wenn dies ist, was Ihr Fall erfordert, dann so sei es. Wir können hier nicht wirklich Ihre Geschäfts- / Programmierspezifischen Bedürfnisse kommentieren. 🙂