Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

differenza tra due date in anni,mesi,giorni

887 views
Skip to first unread message

Luisa

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to
Sono un po' fusa . Sto lavorando a questa "scemenza " da ore e non trovo la
soluzione esatta.
ho due date in due campi diversi e vorrei fare una funzione che calcola
esattamente gli anni, i mesi e i giorni che intercorrono tra le due date.
Non semplicemente come differenza ( month(date1)- month(date2) e
day(date1)-day(date2)) ma se la differenza è negativa devo calcolare i mesi
e i giorni esatti.
Magari è una sciocchezza ma non mi viene..

Grazie per l'aiuto Luisa

Marco

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to
Ciao
Luisa ha scritto nel messaggio <7g4b71$ld3$1...@fe1.cs.interbusiness.it>...
Credo che la funzione DateDiff possa risolvere (torna anche valori negativi)
Ciao marco

Lbo dall'ufficio

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to
>Credo che la funzione DateDiff possa risolvere (torna anche valori negativi)

non credo, datediff torna un numerico che non ha a che vedere con una
data formattata ma e' solo il numero di intervalli tra due date: ti
dice, ad es, 400 giorni, non 1 anno, 2 mesi e 5 giorni.

-----------------------------------
non studio non lavoro non guardo la tv non vado al cinema non faccio sport
-----------------------------------

togliete NOSPAM. per rispondermi via email

-----------------------------------
il sito comune di it.comp.database.access: http://members.xoom.it/it_db_access

Lbo dall'ufficio

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to
>Non semplicemente come differenza ( month(date1)- month(date2) e
>day(date1)-day(date2)) ma se la differenza è negativa devo calcolare i mesi
>e i giorni esatti.
>Magari è una sciocchezza ma non mi viene..

non e' affatto una sciocchezza e c'e' un problema di fondo.

il tipo data/ora di access non e' fatto per registrare intervalli di
tempo, e' fatto per registrare degli istanti precisi. facendo un
paragone geometrico, e' simile al punto sull'ascissa, non al segmento
(come invece avviene per il tipo data/ora di escel che comunque non
gestisce i valori negativi).

in altre parole, il dataora di access ti dice semplicemente quanto
disti dal suo punto zero, fissato alle ore 00:00 del 1 gennaio
dell'anno 100. tu credi di poter scrivere, chesso', 40:00 per
indicare 40 ore di stipendio, in realta' hai scritto qualcosa che
corrisponde alle ore 16 del 2 gennaio dell'anno 100.

l'unica cosa da fare e' scomporre i valori nei loro componenti e
sommarli algebricamente tra loro, applicando i dovuti riporti: ti
sommi i giorni e se viene piu' di trenta fai il modulo 30 e hai i
giorni, prendi l'int della divisione per trenta e hai i mesi, rifai il
modulo 12 ecc. ecc..

li riassembli in un valore stringa e usi quello per presentarlo
all'utente.

ah, i mesi come li consideri, di 30, 31, commerciali, bancari...?

Mezzalira Loris

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to
On Tue, 27 Apr 1999 15:23:34 +0200, "Marco" <marc...@iol.it> wrote:

>Ciao
>Luisa ha scritto nel messaggio <7g4b71$ld3$1...@fe1.cs.interbusiness.it>...
>>Sono un po' fusa . Sto lavorando a questa "scemenza " da ore e non trovo la
>>soluzione esatta.
>>ho due date in due campi diversi e vorrei fare una funzione che calcola
>>esattamente gli anni, i mesi e i giorni che intercorrono tra le due date.

>>Non semplicemente come differenza ( month(date1)- month(date2) e

>>day(date1)-day(date2)) ma se la differenza č negativa devo calcolare i mesi
>>e i giorni esatti.
>>Magari č una sciocchezza ma non mi viene..


>>
>>Grazie per l'aiuto Luisa
>>

>Credo che la funzione DateDiff possa risolvere (torna anche valori negativi)

>Ciao marco
>
>
Non piů di una settimana fa ho visto una risposta ad una identica
domanda (sarai mica sempre tu ?). Non mi interessava, perň mi č
sembrata molto esauriente. Cerca un pň.

Ciao. Loris.

Guido

unread,
Apr 27, 1999, 3:00:00 AM4/27/99
to

E' possibile usare DateDiff (che ritorna un Variant long) per ottenere
intervalli (positivi e negativi) tra due date espressi in una unità di
misura definita.

Visto che il valore restituito è un variant di tipo long, per ottenere
dati precisi è però necessario utilizzare i secondi quale unità di
misura; nell'esempio seguente viene calcolata una differenza tra date
in ore intere (f1) e in ore e decimali di ore (f2); data1 e data2 sono
di tipo date/time.

data1 data2
------------------------ ---------------------------
01/01/99 8.00.00 03/01/99 16.45.00
03/01/99 16.45.00 01/01/99 8.00.00


f1 f2 giorni ore minuti
-------- --------- ------- ---- --------
56,00 56,75 2 8 45
-56,00 -56,75 -2 -8 -45

dove
f1 = DateDiff("h";[data1];[data2])
f2 = (DateDiff("s";[data1];[data2]))/3600

naturalmente, per ottenere giorni, ore e minuti vanno effettuate le
opportune conversioni e, quindi:

giorni = Sgn([f2])*Int(Abs([f2]/24))
ore = Sgn([f2])*Int(Abs([f2]-([giorni]*24)))
minuti = Sgn([f2])*(Abs([f2])-Int(Abs([f2])))*60


naturalmente resta il problema della conversione in anni e mesi;
ovvero:

quanti giorni ha un mese: 30, 31, 28 o 29 ?

quanti giorni ha un anno: 365 o 366 ?


On Tue, 27 Apr 1999 14:49:12 +0200, "Luisa" <lu...@netquasar.com>
wrote:

>Sono un po' fusa . Sto lavorando a questa "scemenza " da ore e non trovo la
>soluzione esatta.
>ho due date in due campi diversi e vorrei fare una funzione che calcola
>esattamente gli anni, i mesi e i giorni che intercorrono tra le due date.
>Non semplicemente come differenza ( month(date1)- month(date2) e

>day(date1)-day(date2)) ma se la differenza è negativa devo calcolare i mesi
>e i giorni esatti.
>Magari è una sciocchezza ma non mi viene..


>
>Grazie per l'aiuto Luisa
>

---------------
Guido
guc...@gedy.it

Enrico T.S.

unread,
Apr 28, 1999, 3:00:00 AM4/28/99
to

Lbo dall'ufficio ha scritto nel messaggio
<3725ea05....@news.interbusiness.it>...

>>Credo che la funzione DateDiff possa risolvere (torna anche valori
negativi)
>
>non credo, datediff torna un numerico che non ha a che vedere con una
>data formattata ma e' solo il numero di intervalli tra due date: ti
>dice, ad es, 400 giorni, non 1 anno, 2 mesi e 5 giorni.
>
Sbagliato !!
Datediff riporta anche quanti anni, quanti mesi o quanti giorni.
Rielggiti meglio l'help in linea.
Bye :o)

Lbo dall'ufficio

unread,
Apr 28, 1999, 3:00:00 AM4/28/99
to
>>dice, ad es, 400 giorni, non 1 anno, 2 mesi e 5 giorni.
>>
>Sbagliato !!
>Datediff riporta anche quanti anni, quanti mesi o quanti giorni.
>Rielggiti meglio l'help in linea.

quello che intendevo dire io e' che datediff ti dice o quanti giorni o
quanti mesi o quanti anni ecc..

non ti combina le cose in modo da poter dire che tra data e data ci
sono x anni, y mesi e z giorni "tutti insieme". o ti dice i giorni o
i mesi o gli anni.

del resto dice l'help:

Restituisce un valore Variant (Long) corrispondente al numero di
intervalli di tempo tra due date specificate.

cioe' restituisce un numerico, non un dataora. non credo nemmeno che
gli puoi applicare un format (che tra l'altro avrebbe poco senso vista
la variabilita' del calendario e la natura del tipodati data/ora piu'
vicina al punto che non al segmento).

se uno ha bisogno di sapere che tra il 15 gennaio 1998 e il 30 marzo
1999 passa "1 anno, 2 mesi, 15 giorni" tocca che si scrive una
funzione ad hoc.

se mi sfugge qualcosa saro' lieto di un esempio.

Enrico T.S.

unread,
Apr 28, 1999, 3:00:00 AM4/28/99
to
Tovi prima gli anni di differenza,
una volta che sai quanti anni sono,
metti l'anno della seconda data nella prima data (o una di comodo)
e con la Datediff vedi quanti mesi sono di differenza.
Poi metti il mese della seconda data nel mese della prima (o quella di
comodo)
e con Datediff vedi la differenza di giorni.
Ed il gioco e' fatto .
Bye :o)


Lbo dall'ufficio

unread,
Apr 28, 1999, 3:00:00 AM4/28/99
to
>Ed il gioco e' fatto .

aaaah vabbe', devi scrivere una routine ad hoc... quello che dicevo
io...

Karl Donaubauer

unread,
Apr 29, 1999, 3:00:00 AM4/29/99
to
Lbo dall'ufficio ha scritto:

>>Ed il gioco e' fatto .
>
>aaaah vabbe', devi scrivere una routine ad hoc... quello che dicevo
>io...

Qualche mese fa ho scritto qc nel ng inglese mpda:

'-----------------------
Public Function YMDgone(argdate As Date)
' shows difference between argDate and today
' by Karl Donaubauer 24.1.1999 using the DevAshishian boolean-trick ;-)

Dim Ygone As Integer, Mgone As Byte, Dgone As Byte

If IsNull(argdate) Then Exit Function
Ygone = DateDiff("yyyy", argdate, Date) _
+ Int(Format(Date, "mmdd") < Format(argdate, "mmdd"))

Mgone = Int((DateDiff("m", argdate, Date) _
+ Int(Format(Date, "dd") < Format(argdate, "dd")))) Mod 12

If Day(argdate) <= Day(Date) Then
Dgone = Format(Date, "dd") - Format(argdate, "dd")
Else
Dgone = Day(DateSerial(Year(argdate), Month(argdate) + 1, 0)) _
- Day(argdate) + Day(Date)
End If

YMDgone = Ygone & " year" & IIf(Ygone = 1, " ", "s ") _
& Mgone & " month" & IIf(Mgone = 1, " ", "s ") _
& Dgone & " day" & IIf(Dgone = 1, " ", "s")

End Function
'-----------------------

cu
Karl
------
Access-FAQ http://members.eunet.at/donkarl/ (tedesco)
Per rispondermi rimuovere XDELETEX dall'indirizzo email.

0 new messages