SELECT
fromDate,
toDate,
diffTotalDays,
CONCAT(diffMonths, ' Monate und ', diffDays, ' Tage (insgesammt ', diffTotalDays, ' Tage)') AS diffAsString,
diffMonths,
diffDays
FROM
(
SELECT
@fromDate := d.date AS fromDate,
@toDate := CURDATE() AS toDate,
# === temporäre Berechnungen ===
# Diese können auch wegreduziert werden. Jedoch wird dann das SQL unlesbar
# @flag1: Bestimmung ob der Tag des Monats im @fromDate grösser ist als in @toDate
@flag1 := (DAY(@toDate) < DAY(@fromDate)),
# @diffMonthsTemp: Direkt berechneter Unterschied der Monat unabhängig vom Tag
@diffMonthsTemp := PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM @toDate), EXTRACT(YEAR_MONTH FROM @fromDate)),
# @fromDateInMonthToS: Der Monatstag von @fromDate auf den Moant von @toDate angwendet
@fromDateInMonthToS := CONCAT(YEAR(@toDate), '/', MONTH(@toDate) - IF(@flag1, 1, 0), '/', DAY(@fromDate)),
# @fromDateInMonthTo: fromInMonthToS zu Datum Konvertiert
@fromDateInMonthTo := STR_TO_DATE(@fromDateInMonthToS, '%Y/%m/%e'),
# === Endgültige Berehnung ===
# Einfache Differenz in Tagen
DATEDIFF(@toDate, @fromDate) AS diffTotalDays ,
# Differenz der Monate. Ist der Monatstag im @fromDate grösser als im @toDate muss die Zahl um 1 reduziert werden
@diffMonthsTemp - IF(@flag1, 1, 0) AS diffMonths,
# Diferenz der Tage in Kombination mit diffMonths
DATEDIFF(@toDate, @fromDateInMonthTo) AS diffDays
FROM date As d
) data