PDA

View Full Version : [MySQL] funzione datediff


anonimizzato
23-02-2011, 12:19
Ciao a tutti,

ho bisogno di utilizzare una funzione in MySQL che calcoli la differenza tra due date senza considerare la domenica.

In rete ho trovato questa:

BEGIN
DECLARE dow1, dow2, days INT;
SET dow1 = DAYOFWEEK(d1);
SET dow2 = DAYOFWEEK(d2);
SET days = FLOOR( DATEDIFF(d2,d1)/7 ) * 5 +
CASE
WHEN dow1=1 AND dow2=7 THEN 5
WHEN dow1 IN(7,1) AND dow2 IN (7,1) THEN 0
WHEN dow1=dow2 THEN 1
WHEN dow1 IN(7,1) AND dow2 NOT IN (7,1) THEN dow2-1
WHEN dow1 NOT IN(7,1) AND dow2 IN(7,1) THEN 7-dow1
WHEN dow1<=dow2 THEN dow2-dow1+1
WHEN dow1>dow2 THEN 5-(dow1-dow2-1)
ELSE 0
END;
RETURN days;
END

Ma esclude non solo la domenica ma anche il sabato.

Ho provato a ragionarci un pò sopra ma non ho capito come modificarla per i miei scopi.

Mi potreste dare una mano?

Grazie in anticipo.

wingman87
23-02-2011, 14:59
Ciao, io farei così, in pseudocodice, ponendo che domenica=1:

firstday=DAYOFWEEK(d1);
lastday=DAYOFWEEK(d2);
totaldays = DATEDIFF(d2,d1);

effectivedays = totaldays - floor(totaldays/7);

if(totaldays%7 != 0)
if( lastday<firstday || firstday=1 || lastday=1 )
effectivedays = effectivedays - 1;

In pratica prendo i giorni tra le due date e tolgo almeno un giorno ogni 7 (le domeniche) arrotondando per difetto. Alla fine, se nei giorni di resto c'era una domenica, tolgo un altro giorno. Per esserci una domenica tra i giorni di resto, 1 dev'essere compreso tra firstday e lastday (da qui lastday<firstday) compresi (da qui firstday=1 || lastday=1).

Spero sia corretto, ci ho riflettuto a lungo ma può essermi sfuggito qualcosa. E magari c'è una soluzione ancora più semplice...