User Tools

Site Tools


mysql:datediffwithmonthanddays

[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"
mysql/datediffwithmonthanddays.txt · Last modified: 09.12.2013 09:39:54 (external edit)