====== [MySQL] Spielereien mit dem Datum ====== Diverse kleine Spielereien rund um das Datum. ===== Berechnen des nächsten Samstages ===== STR_TO_DATE(DATE_FORMAT(NOW(), '%v.6.%x'),'%v.%w.%x') AS nextSaturday Zur Erklärung. Mittels DATE_FORMAT schreibe ich einen String mit der Woche im Jahr, dem Wochentag 6 (Samstag) und dem Jahr zur Woche. Das ergibt für den 6. November 2013 den folgenden String: ''45.6.2013''. Anschliessend wandle ich das wieder in ein Datum zurück. ===== Datumsdifferenz mit Monate und Tage ===== Ein kleines Beispiel wie man eine Datumsduifferenz in Tagen und Monaten ausgeben kann. Also "Es dauert noch 5 Tage und 10 Monate bis Heiligabend" ==== Funktion ==== 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(DATE_FORMAT(@toDate, '%Y%m'), DATE_FORMAT(@fromDate, '%Y%m')), -- @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 Ausgabe "fromDate";"toDate";"diffTotalDays";"diffAsString";"diffMonths";"diffDays" "2009-03-20";"2010-06-07";"444";"14 Monate und 18 Tage (insgesammt 444 Tage)";"14";"18" "2009-03-01";"2010-06-07";"463";"15 Monate und 6 Tage (insgesammt 463 Tage)";"15";"6" {{tag>MySQL Date}}