Newsgroup: it.comp.lang.visual-basic
Titolo: Conteggio giorni fra 2 intervalli di date

Ciao a tutti,
ho 2 intervalli di date es.:
1) Dal 01/04/08 al 30/06/08
2) Dal 01/01/08 al 31/12/08
Devo trovare in un caso quanti sono i giorni che sono sia nel primo che nel
secondo intervallo (l'intersezione), mentre in un altro caso il numero di
giorni che sono nell'intervallo 2 ma non nell'intervallo 1.
Nell'esempio avrò circa 90gg per quelli in comune e circa 120gg per quelli
solo nel secondo intervallo.
Gli intervalli possono essere un po' con tutte le combinazioni, quindi il
secondo intervallo può avere tutti giorni in comune, essere sempre
precedente o sempre successivo, e essere sia prima che dopo.
Per farmi capire:
http://img169.imageshack.us/img169/1220/periodoza2.gif
Il verde è 1) i gialli sono i possibili 2)
Avete qualche consiglio di come metterlo in VB6?
Tnx


Supponendo:
- Intervallo1 identificato da StartDate1 ed EndDate1, con 
StartDate1<=EndDate1
- Intervallo2 identificato da StartDate2 ed EndDate2, con 
StartDate2<=EndDate2
- di aver definito le funzioni Min(a,b) e Max(a,b), di cui non riporto 
l'implementazione perché ovvia...
Per trovare l'intersezione:
' Controllo che siano effettivamente sovrapposti
If (StartDate2>EndDate1) Or (StartDate1>EndDate2) Then
    Intersezione = 0
Else
    Intersezione = DateDiff("d", Max(StartDate1,StartDate2), 
Min(EndDate1,EndDate2)) + 1
ElseIf
Per trovare il secondo valore (giorni nell'intervallo 2 che non sono anche 
nel primo), basta sottrarre al numero di giorni dell'intervallo 2 il valore 
dell'intersezione.
HTH
Ciao
Raf 

 2) Dal 01/01/08 al 31/12/08
zac
a idea se vuoi giocare con le combinazioni possibili e deve essere il piů 
generale possibile
unico vincolo....un anno!(la complicazione di piů di 1 anno falla tu)
Matrice di 365 giorni di stringhe
impostala vuota all'inizio
ciclati il primo periodo
dove c'č il giorno scrivici dentro "A"
Ciclati il secondo periodo
dove c'č il giorno scrivici "B"
Dove c'č anche A scrivici "AB"
( č semplice giorni(Ngiorno)=giorni(Ngiorno) + "B" )
ripeti quanti periodi vuoi
Alla fine cicla la matrice e stampa i risultati
piů generale di cosě non mi viene in mente!
-----------------------------
Mio Blog
http://www.martek.it/dblog/default.asp
Mia cittŕ
http://wodka40hall.myminicity.com/
***
Best Shit of 2008: DOOMSDAY!
http://www.martek.it/dblog/articolo.asp?articolo=120
 

 Mia città


 Il modo più semplice è usare la Julian date.
zac
...abbi pazienza dissento!
Il problema non è trovare (almeno da quello che dice) un intervallo di date
ma l'INTERSEZIONE di due insiemi....
Ora svincolandoci dalle date...e ammettendo che gli insiemi possano essere 
anche più di due...il mio metodo è poco "fine": è "brute force"! Ma (provato 
anche in altre occasioni) per intervalli relativamente 
piccoli...estremamente veloce e pratico!
Puoi sostituire se non ti serve la notizia "di chi interseca chi" la "lenta" 
string...con un veloce long ed avere il valore "pesato" 
giorni(Ngiorno)=giorni(Ngiorno) + 1
dipende da quello che vuole fare...lui parlava di intersezione...io mi son 
concentrato su quella!
:o)
-- 


 ( è semplice giorni(Ngiorno)=giorni(Ngiorno) + "B" )
Idea semplice e furba; mi piace
--
greg

 più generale di così non mi viene in mente!
Allora, ero fuori in questi giorni e ho fatto una cosa del genere:
Trasformo le date in Long. PeriodoMax e Min corrispondono al "verde"
dell'immagine del primo post.
Ciclo nel periodo giallo, e in un caso prendo i numeri compresi, nell'altro
prendo i numeri fuori, dovrebbe anche andare, anche se forse non è molto
ottimizzato (ma si parla di norma di 365 iterazioni non di più), ma è molto
leggibile.
  Dim i As Long, PeriodoMin As Long, PeriodoMax As Long
  PeriodoMin = cLng(DataInizio)
  PeriodoMax = cLng(DataFine)
  If Tipo = 1 Then  'conto quelli fuori periodo
    For i = DataInizioCompetenza To DataFineCompetenza
      If i < PeriodoMin Or i > PeriodoMax Then
        ImportoTmp = ImportoTmp + ImportoGiorno
      End If
    Next i
 
  Else              'conto quelli dentro al periodo
 
    For i = DataInizioCompetenza To DataFineCompetenza
      If i >= PeriodoMin And i <= PeriodoMax Then
        ImportoTmp = ImportoTmp + ImportoGiorno
      End If
    Next i
 
  End If

 dell'intersezione.
Grazie, ora me lo studio un attimino. :)
Per ora avevo risolto in altro modo, vedi altro post.
Tnx