Grazie, mi sembra un buon tutorial, domani lo guardo.
La funzione DateFM è una mia funzione che restituisce il fine mese di una data in ingresso.
La funzione serve per calcolare quali sono le date di inizio e fine periodo del prossimo rendiconto di vendita. Si parla di libri, che normalmente vengono rendicontati, con relativo calcolo di royalties, una o due volte all'anno.
A questo punto, giusto per la cronaca, ti posto tutta la funzione, che è poi la trasposizione di una in basic
FUNCTION `NewRvDt`(PubDt DATE,GbDt DATE,VerM TINYINT,VerH TINYINT,DtType TINYINT,DtToday DATE) RETURNS date
   DETERMINISTIC
BEGIN
-- DtType =0 start period, =1 end period, =2 end period today
 DECLARE bytNumMesi TINYINT DEFAULT 0;
 DECLARE bytMeseIni TINYINT DEFAULT 0;
 DECLARE dtmIni DATE DEFAULT NULL;
 DECLARE dtmReturn DATE DEFAULT NULL;
 
 if isnull(PubDt) and isnull(GbDt) then
   set dtmReturn = Null;
   return dtmReturn;
 End If;
 set VerM = ifnull(VerM,1);
 set VerH = ifnull(VerH,1);
 -- imposta data iniziale periodo
 SET dtmIni=date_add(ifnull(GbDt, PubDt), INTERVAL 1 DAY);
 -- imposta numero mesi periodicità
 SET bytNumMesi = VerH;
 If bytNumMesi<= 0 Or bytNumMesi > 12 Then
   set bytNumMesi=1;
 End If;
 set bytNumMesi= 12 / bytNumMesi;
 
 -- imposta mese iniziale periodo
 set bytMeseIni=VerM;
 If bytMeseIni<=0 Or bytMeseIni>12 Then
   set bytMeseIni=1;
 End If;
 -- crea data sicuramente futura
 set dtmReturn = DateYMD(Year(dtmIni) + 2, bytMeseIni, 1);
 -- sottrae numero mesi fino a renderla minore o uguale a dtmIni
 While dtmReturn > dtmIni do
   set dtmReturn = Date_Add(dtmReturn, INTERVAL -bytNumMesi MONTH);
 End While;
 
 -- da data iniziale ottiene data finale se richiesta
 If DtType = 1 Then        -- data finale periodo
   Set dtmReturn = Date_Add(Date_Add(dtmReturn, INTERVAL bytNumMesi MONTH),INTERVAL -1 DAY);
 ElseIf DtType = 2 Then    -- data finale a oggi
   Set dtmReturn = Date_Add(Date_Add(dtmReturn, INTERVAL bytNumMesi MONTH),INTERVAL -1 DAY);
   While DateFM(Date_Add(dtmReturn, interval bytNumMesi month))<=DtToday do
     Set dtmReturn = DateFM(Date_Add(dtmReturn, interval bytNumMesi month));
   End While;
 End If;
 RETURN dtmReturn;
END