Newsgroup: it.comp.appl.access
Titolo: Differenza fra Date

Scusate ma ho avuto seri problemi con il PC ..ho fatto di già questa domanda
ma fra un Format C: e un altro ...non riesco a trovare più nulla!!!
ho cercato anche nei vecchi post ..ma non ho trovato nulla!
Scusandomi per l'ennesimo post (ora ho PC nuovo e connessione fastweb !!) vi
chiedo di aiutarmi !!!!
Ho le seguenti date:
01/01/01
02/02/02
voglio ottenere 3 campi che risultino essere la differenza esatta fra le
date  ovvero:
1 (anno) 1 (mese) 2 (giorni, contando anche l'ultimo)
Grazie e scusatemi  ancora

 ha scritto nel messaggio
news:AWqrc.3498$G%.1538@tornado.fastwebnet.it...

datediff

 ha scritto nel messaggio
news:c8lg8f$gta$1...@lacerta.tiscalinet.it...


 ha scritto nel messaggio
news:34src.3582$G%.2548@tornado.fastwebnet.it...

Non so se esista una soluzione piu' semplice: sicuramente in vba
risulterebbe molto piu' leggibile.
SELECT  a.Dal, a.Al,
-- se aggiungendo la differenza in anni alla data di partenza supero la data
fine allora la differenza in anni e' uguale alla datadiff - 1 altrimenti...
IIf(DateAdd("yyyy",DateDiff("yyyy",[Dal],[Al]),[dal])>[Al],
DateDiff("yyyy",[Dal],[Al])-1 , DateDiff("yyyy",[Dal],[Al])) AS Annidiff,
-- come prima solo che il risultato usa il resto della divisione per 12
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],DateDiff("m",[Dal],[Al]
) Mod 12-1,DateDiff("m",[Dal],[Al]) Mod 12) AS Mesidiff,
-- GIORNI
esempio : 10/01/2004 - 15/10/2004
prima calcola la differenza in mesi che e' 10
poi arriva al 10/10/2004 e da qui differenza in giorni
esempio : 10/1/2004  - 05/10/2004
differenza in mesi : 10
arrivando al 10/10/2004 supero la data fine per cui riporta al mese prima
10/09/2004
calcola la differenza in giorni
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],
DateDiff("d",DateAdd("m",DateDiff("m",[Dal],[Al])-1,[dal]),[Al]),
DateDiff("d",DateAdd("m",DateDiff("m",[Dal],[Al]),[dal]),[Al])) AS
Giornidiff
FROM tabella1 AS a
Ciao Nicola

 ha scritto nel messaggio
news:UIDrc.227157$hc5.9...@news3.tin.it...


 ha scritto nel messaggio
news:UIDrc.227157$hc5.9...@news3.tin.it...


 Potresti spiegarmi piů facilmente come e da dove trascrivere il tuo
codice?
Potresti invece spiegarmi tu perchč non scrivi correttamente DOPO il
quoting?
Antonio


[CUT]

Se stai usando il query builder in Visualizzazione Struttura devi sostituire
-    "yyyy" con "aaaa"
-     , (virgola) con ; (punto e virgola)
-     "d" con "g"
Se invece scrivi in Visualizzazione Sql dovrebbe funzionare cosi' come e'
La ritrascrivo comunque senza commenti in linguaggio Sql ( che chiaramente
e' l'unico possibile qui)
SELECT a.Dal, a.Al,
IIf(DateAdd("yyyy",DateDiff("yyyy",[Dal],[Al]),[dal])>[Al],DateDiff("yyyy",[
Dal],[Al])-1,DateDiff("yyyy",[Dal],[Al])) AS Annidiff,
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],DateDiff("m",[Dal],[Al]
) Mod 12-1,DateDiff("m",[Dal],[Al]) Mod 12) AS Mesidiff,
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],DateDiff("d",DateAdd("m
",DateDiff("m",[Dal],[Al])-1,[dal]),[Al]),DateDiff("d",DateAdd("m",DateDiff(
"m",[Dal],[Al]),[dal]),[Al])) AS Giornidiff
FROM tabella1 AS a;
Ciao Nicola
PS Fai attenzione al quoting

 scusa ma cos'è il quoting?
Prova a vedere il post "Come ci si dovrebbe comportare..."
Antonio


 FROM tabella1 AS a;
Ho trascritto il tuo codice ...ma funziona a metà!!
se inserisco:
dal: 18/05/76
al:    16/05/77
mi restituisce:
aa  mm   gg
0   -1     28
invece di:
aa  mm   gg
 0   11    29
perchè?


...forse ora  funziona ( almeno credo).
SELECT a.Dal, a.Al,
IIf(DateAdd("yyyy",DateDiff("yyyy",[Dal],[Al]),[dal])>[Al],DateDiff("yyyy",[
Dal],[Al])-1,DateDiff("yyyy",[Dal],[Al])) AS Annidiff,
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],IIf((DateDiff("m",[Dal]
,[Al]) Mod 12-1)<0,(DateDiff("m",[Dal],[Al]) Mod
12-1)+12,(DateDiff("m",[Dal],[Al]) Mod 12-1)),DateDiff("m",[Dal],[Al]) Mod
12) AS Mesidiff,
IIf(DateAdd("m",DateDiff("m",[Dal],[Al]),[dal])>[Al],DateDiff("d",DateAdd("m
",DateDiff("m",[Dal],[Al])-1,[dal]),[Al]),DateDiff("d",DateAdd("m",DateDiff(
"m",[Dal],[Al]),[dal]),[Al])) AS Giornidiff
FROM tabella1 AS a;
Sta diventando sempre piu' lunga ed e' praticamente illeggibile. Chiaramente
deve essere dal   > al
Ciao Nicola

 Grazie per la tua infinita pazienza ..domani provo il codice e ti farò
sapere...ma posso farti una domanda
stupida?
cosa intendi per:
"deve essere dal   >  al " ....una data maggiore di un'altra?
ovvero per "dal" dovrei inserire la data più recente?
Un'altra domanda :
se volessi fare la somma di due date ..con gli stessi principi ...basterebbe
sostituire nel tuo codice  "dateAdd" a "datediff"?
Se risolvo questi problemi ...ho fatto 13!!!
...grazie a te!!!!!!


Non sono sicuro di aver capito bene: vuoi dire sommare ad una data
una cosa tipo 1 anno + 2 mesi + 3 giorni?
Ciao Nicola

 ha scritto nel messaggio
news:F96tc.343745$rM4.14...@news4.tin.it...

.....
Ho provato il tuo codice ..funziona alla grande( mi piacerebbe capire cosa
hai scritto!!come faccio ad imapare a fare e leggere il tuo codice?)
Per  il resto ho bisogno proprio di questa cosa!!
una volta trovata la differnza fra date ...il cui risultato è
per esempio:
15(anni) 6 (mesi)  25(giorni)
e la differenza fra altre due date, il cui risultato è:
1(anno)  7(mesi)    25( giorni)
...dovrei ora sommare i due risultati:
15(anni) 6 (mesi)  25(giorni)    +
 1(anno)  7(mesi)    25( giorni)  =
_________________________
17(anni)  2(mesi)    21(giorni, perchè devo contare
                                   sempre l'ultimo)
...grazie ancora per il tuo prezioso aiuto..non hai idea da quanti mesi ci
stavo sbattendo la testa !!!
Ciao Ivano.

 Ho eliminato il mio ultimo  post per errore..
tu puoi visualizzarlo? lo hai già visto?


Premesso che non so se sul sito comune ci sia qualcosa al riguardo direi
che prima di tutto occorre stabilire quanti gg dura un mese.
Se ipotizziamo 30 allora
Dato1 : anno1,mese1,giorni1
Dato2: anno2,mese2,giorni2
Giornitot = (giorni1+giorni2+1) mod 30
MesiTot = (Mesi1+Mesi2+(giorni1+giorni2+1)\30)  mod 12
AnniTot = Anno1 + Anno2 + (Mesi1+Mesi2+(giorni1+giorni2+1)/30)  \12
Non l'ho provate e magari hanno bisogno di una registratina.
L'idea fondamentale e' l'uso di MOD ( resto di una divisione fra interi) e \
(divisione fra interi con risultato intero).
Ciao Nicola

 Grazie domani in ufficio la provo e ti farņ sapere.
Certo l'ideale sarebbe far capire ad access che esistono
gli anni bisestili, i mesi di 30 e quelli di 31 ma, considerata
la tollerenza di errore che posso includere  .....
...se poi consideriamo  che dovevo fare tutto "a mano" e aggiungerlo al
report che avevo prodotto!!!
grazie 1000


Se traduci le differenze di date in qualcosa tipo
1anno + 3mesi + 20 giorni mi pare evidente che da qui sia impossibile
stabilire se l'intervallo copra anni bisestili, mesi con 31 giorni...
Forse se tu indicassi esattamente come sono fatti i dati che tratti e quale
e' il risultato che vorresti ottenere si potrebbe cercare un sistema
'perfetto'
Ciao Nicola

 ha scritto nel messaggio
news:gnouc.369558$rM4.15...@news4.tin.it...

beh  devo dirti che la cosa è presto detta!!
se ho due date:
01/01/98
02/05/06
access "dovrebbe capire" che  1 anno è formato da 365 giorni di cui 12 mesi
divisi come sappiamo in mesi di 30 e 31 e che ogni 4 anni c'è l'anno
bisestile
la differenza fra le due date come dici tu nel tuo esempio
(1 anno +3 mesi+20gg) dovrebbe capire il calendario
e aggiungere o togliere i gg mm aa a seconda dei mesi dell'anno...sbaglio?
access non riesce  a fare somma e diffferenza tenendo conto del calendario?

access non riesce  a fare somma e diffferenza tenendo conto del calendario?
È solo un abbozzo: se l'idea ti piace vedi magari se puoi smagrare un
po' il codice ...
-----------------
Private Type ThanosDifferenza
    ThGiorni As Long
    ThMesi As Long
    ThAnni As Long
End Type
Private Function ThDifferenza(ByVal dtmDataIni As Date, ByVal _
    dtmDataFin As Date) As ThanosDifferenza
    Dim dtmDataTmp As Date
        ThDifferenza.ThAnni = DateDiff("yyyy", dtmDataIni, _
            dtmDataFin)
        If DateAdd("yyyy", ThDifferenza.ThAnni, dtmDataIni) _
             > dtmDataFin Then
                ThDifferenza.ThAnni = ThDifferenza.ThAnni - 1
        End If
        dtmDataIni = DateAdd("yyyy", ThDifferenza.ThAnni, _
            dtmDataIni)
        ThDifferenza.ThMesi = DateDiff("m", dtmDataIni, _
            dtmDataFin)
        If DateAdd("m", ThDifferenza.ThMesi, dtmDataIni) _
             > dtmDataFin Then
                ThDifferenza.ThMesi = ThDifferenza.ThMesi - 1
        End If
        dtmDataIni = DateAdd("m", ThDifferenza.ThMesi, _
            dtmDataIni)
        ThDifferenza.ThGiorni = DateDiff("d", dtmDataIni, _
            dtmDataFin)
End Function
-----------------
Ciao
--
Alberto
No alle guerre

 ha scritto nel messaggio
news:n94nb0h5qej440v3k...@4ax.com...

GRAZIE  Lo proverò subito e ti farò sapere ma il risultato di questo codice
mi serve diviso in tre campi(aa,mm,gg)perchè devo inserire i campi
sopracitati in un report dove poter sommare o togliere (anni,mesi o giorni)
Grazie Ivano.

 ha scritto nel messaggio
news:0bLuc.17337$G%.3908@tornado.fastwebnet.it...

Riporto qui la tua richiesta:
[Inizio]
...dovrei ora sommare i due risultati:
15(anni) 6 (mesi)  25(giorni)    +
 1(anno)  7(mesi)    25( giorni)  =
_________________________
17(anni)  2(mesi)    21(giorni, perchè devo contare
                                   sempre l'ultimo)
[Fine richiesta]
Quello che intendevo e' che l'informazione sulle date non e' piu'
sufficiente per determinare cose tipo
quelle che indichi nel messaggio( anno bisestile? mese di 30,31,28,29 ? ...)
Se vuoi si deve ripartire dalle quattro date
dal1,al1
dal2,al2
ma a questo punto ti chiedo: cosa significa fare la somma?
Ciao Nicola
PS volevo anche aggiungere che access nelle funzioni di manipolazione delle
date considera  gli
anni bisestili, il numero di giorni dei mesi ...


......."SOMMA" ? ti spiego meglio...giustamente se non sai a cosa mi serve
......te lo spiego:
Io ho un report in cui devo indicare:
- data di arruolamento
- servizio militare [eventualmente svolto,  espresso  in
                           aa,mm,gg (ovvero.. ho fatto 1 anno e 6
                           mesi ..come nel linguaggio parlato)]
devo sommare queste date perchè se arrivo ad un totale di 17 anni ho diritto
(16anni 6 mesi 1 giorno si
arrotondano a 17) ho diritto ad un "nastrino".
Lo stesso quando maturo i 29 anni.
Però a questi risultati devo detrarre eventuali periodi in cui sono stato
malato, ricoverato, aspettativa.....quindi se arrivo a 17 ma ho fatto 6 mesi
e 29 giorni di "assenza" dovrò togliere questo periodo e avrò maturato solo:
16 anni 5 mesi e 2 giorni(conto sempre il giorno di partenza)
Ho reso l'idea?
...poi avrei un'altra domanda da 1.000.000 di dollari da farti?..posso in un
report strutturato a nido d'ape infilare il risultato di una dozzina di
query?
ciao
Ivano

 ha scritto nel messaggio
news:uz6vc.19165$G%.14797@tornado.fastwebnet.it...

Io ho una certa idiosincrasia ai report ma in ogni caso non sono riuscito a
capire cosa sia un report a nido d'ape. Spiegati meglio
Ciao Nicola
Forse stiamo andando un po' OT sul primo argomento: se vuoi possiamo
continuare in privato
rimuovi nospamxx dal mio indirizzo

Grazie Ivano.
Ciao


[cut]
Ciao Ivano,
ho provato a risponderti ma mi da indirizzo di posta inesistente.
Nicola

 scusa prova:
tha...@libero.it
 (funziona di sicuro!)