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