Newsgroup: it.comp.appl.access
Titolo: Differenza tra date con anno a base 360

Ciao a tutti.
Un cliente mi ha chiesto di calcolare la differenza tra due date
basando i calcoli sull'anno commerciale, pari a 360 gg. 
Detta così sembra semplice ma ho cominciato a lavorarci e tanto
semplice non è; magari qualcuno della lista  ha già affrontato il
problema e può darmi qualche dritta.
---------------
Guido
light...@flashnet.it

problema e può darmi qualche dritta.
io mi ricordo... si', io mi ricordo...
che una volta scrissi una cosa in vb per calcolare il cosiddetto
utilizzo dei fondi dei clienti insolventi di una banca.
nell'anno commerciale tutti i mesi sono convenzionalmente intesi di
durata pari a 30 giorni.
se si calcolano gli interessi in base all'anno commerciale si fa un
favore al cliente moroso, perche' gli interessi diminuiscono.
come risolsi la faccenda?  mi sembra di ricordare che spezzai il
calcolo della differenza in 3=3 problemi.
la differenza tra la data di inizio e la fine mese convenzionale,
quella col mese a 30, poi la differenza in mesi (sempre convenzionali
da 30 giorni) dall'ultimo del mese all'ultimo dell'anno, poi la
differenza in anni, poi la differenza in mesi fino al mese della data
fine, poi i giorni a partire dal primo del mese.
ad esempio, dal 5 maggio 1980 al 12 settembre 1990.
dal 5 al 30 sono 25 gg.  poi c'e' giugno, luglio... dicembre, 6 mesi,
ossia 180 gg.  poi c'e' l'81, '82... 89, sono 9 anni da 360 gg
ciascuno, quindi 3240 gg.
poi gennaio 1990, febbraio, marzo... agosto.  sono 8 mesi da 30 gg,
altri 240 gg.  poi 12 gg di settembre.
in finale: 25+180+3240+240+12= 3697 gg, invece che
?datediff("d", "1980/05/05", "1990/09/12")
3782
ossia 85 giorni di interessi in meno.
il bello viene quando la data inizio cade il 28 o il 29 febbraio, o un
31.  che si fa in quel caso?  per il 28 e il 29 vanno aggiunti
rispettivamente 2 o 1 giorno.  per il 31 si fa come se fosse il 30.
se la data fine, invece, cade il 28 o il 29 febbraio ovviamente si
contano solo 28 o 29 giorni.  se cade il 30 se ne contano 30, se cade
il 31 se ne contano ugualmente 30.
una volta risolti questi casi particolari alle estremita' ti puoi
gestire gli intervalli intermedi come ti ho detto.
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/


Ringrazio lbo per il suggerimento che ho messo in pratica, ricavando
la seguente funzione:
'-------------------------------------------------------------------------------------------
Function DiffDate360(d1 As Date, d2 As Date) As Long
'-------------------------------------------------------------------------------------------
    Dim diff1 As Long, diff2 As Long, diff3 As Long, diff As Long
    Dim dAppo1 As Date, dAppo2 As Date
 
    ' --- Gestione primo intervallo della differenza
    If d1 <> EOM(d1) Then
        diff1 = 30 - Day(d1)
    Else
        diff1 = 0
    End If
    ' --- Gestione secondo intervallo della differenza
    dAppo1 = EOM(d1)
    dAppo2 = EOM(DateAdd("m", -1, d2))
    diff2 = DateDiff("m", dAppo1, dAppo2) * 30
 
    ' --- Gestione terzo intervallo della differenza
    If d2 <> EOM(d2) Then
        diff3 = Day(d2)
    Else
        diff3 = 30
    End If
    DiffDate360 = diff1 + diff2 + diff3 + 1
End Function
'-------------------------------------------------------------------------------------------
Grazie e a buon rendere
---------------
Guido
light...@flashnet.it