Re: Generare righe "intermedie"
On 28/ott/08, at 09:03, gabriele(dot)bartolini(at)2ndquadrant(dot)it wrote:
Ciao Giorgio,
non ti ho abbandonato. E' che la commit fest per PG 8.4 è il 1
novembre e dobbiamo preparare una patch importante per quella data.
Scusami.
Scusa tu! Da un certo punto di vista è più importante il commit fest ;-)
2008/10/27 Giorgio Valoti <giorgio_v(at)mac(dot)com>
No, si tratta di calcolare dei valori d'interesse con
capitalizzazione annuale; da qui l'esigenza del raggruppamento
annuale. La prima tabella, quella con i periodi irregolari,
restituisce i periodi con i tassi d'interesse omogenei e se non
fosse per la capitalizzazione il discorso sarebbe chiuso.
Ho ancora i rimasugli di matematica finanziaria delle superiori
(preistoria oramai).
Comunque, per orientarmi meglio, la capitalizzazione annuale la fai
contando il numero di giorni? Inoltre, intendi avvalerti di stored
procedure per fare il calcolo?
Scusami ma magari tu stai dando per scontato (giustamente) il
contesto, mentre personalmente io avrei bisogno di maggiori
informazioni per aiutarti meglio.
eh lo so… è sempre un po’ un casino via mail.
Per quanto riguarda la capitalizzazione e gli interessi. Questi ultimi
li calcoli giorno per giorno, mentre la capitalizzazione avviene al
massimo ogni 12 mesi (nel mio caso), ovvero, all’inizio di ogni anno.
Per un esempio concreto (ma forse non correttissimo, visto che non
sembra tenere conto dei bisestili) puoi andare su http://www.avvocati.it/servizi/calcolo/interessi_legali.php
.
Per quanto riguarda l’uso di stored procedures. Sì, sicuramente le
userò e la ragione è proprio la capitalizzazione. Questo è un
frammento della versione che stavo abbozzando (spero non sia una
boiata) che però ha il problema a cavallo del 1990, visto che il tasso
d’interesse è stato cambiato a metà dicembre:
for r in
select da, a, tasso, giorni, 0 as capitale, 0 as interessi
from
(select p.da, p.a, tl.valore as tasso, p.a - p.da + 1 as giorni
from
(select da_in as da, ('31/12/'||first_year)::date as a
union
select
(('01/01/'||first_year)::date + '1
year'::interval * i)::date,
(('31/12/'||first_year)::date + '1
year'::interval * i)::date
from generate_sries (1,(last_year -
first_year)::int - 1) as i
union
select ('01/01/'||last_year)::date, a_in) as p
join tasso_legale tl on (tl.da <= p.da and tl.a >=
p.a)) as giorni
loop
current_interessi := r.tasso * cap * r.giorni / 365;
r.interessi := format_num(current_interessi);
r.capitale := format_num(cap);
if capitalizzazione then
cap := cap + current_interessi;
end if;
return next r;
end loop;
dove first_year è ricavato dalla data iniziale e last_year da quella
finale e la tabella dei tassi legali è la seguente:
da | a | valore
----------+------------+--------
1904-01-01 | 1990-12-15 | 5,00
1990-12-16 | 1996-12-31 | 10,00
1997-01-01 | 1998-12-31 | 5,00
1999-01-01 | 2000-12-31 | 2,50
2001-01-01 | 2001-12-31 | 3,50
2002-01-01 | 2003-12-31 | 3,00
2004-01-01 | 2007-12-31 | 2,50
2008-01-01 | 2008-12-31 | 3,00
Grazie
--
Giorgio Valoti
Home |
Main Index |
Thread Index