Monatsdifferenz zwischen zwei beliebigen Daten:
Ich bin überrascht, dass dies noch nicht erwähnt wurde:
Sehen Sie sich den TIMESTAMPDIFF() Funktion in MySQL.
Damit können Sie zwei TIMESTAMP
übergeben oder DATETIME
Werte (oder sogar DATE
da MySQL automatisch konvertiert) sowie die Zeiteinheit, auf der Sie Ihre Differenz basieren möchten.
Sie können MONTH
angeben als Einheit im ersten Parameter:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
Es erhält im Grunde die Anzahl der Monate, die seit dem ersten Datum in der Parameterliste vergangen sind. Diese Lösung kompensiert automatisch die unterschiedliche Anzahl von Tagen in jedem Monat (28, 30, 31) und berücksichtigt Schaltjahre – Sie müssen sich um nichts davon kümmern.
Monatsdifferenz mit Genauigkeit:
Es ist etwas komplizierter, wenn Sie eine Dezimalgenauigkeit in die Anzahl der verstrichenen Monate einführen möchten, aber hier ist, wie Sie es tun können:
SELECT
TIMESTAMPDIFF(MONTH, startdate, enddate) +
DATEDIFF(
enddate,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
) /
DATEDIFF(
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
MONTH,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
)
Wobei startdate
und enddate
sind Ihre Datumsparameter, sei es aus zwei Datumsspalten in einer Tabelle oder als Eingabeparameter aus einem Skript:
Beispiele:
With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097
With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667
With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935