====== [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}}