Newsgroup: it.comp.appl.access
Titolo: Differenza fra due date (funzione completa).

Vorrei suggerire una funzione completa per la differenza fra due date.
(questo è codice freeware, niente di illegale)
La funzione seguente permette il calcolo di una differenza precisa tra due
date/tempi
Si deve specificare come si vuole la differenza tra le due date/tempi
fornendo annno (y), mese (m), giorno (d), ora (h), minuto (n), secondo (s).
Esempio:
?Diff2Dates("y", #06/01/1998#, #06/26/2002#)
4 years
?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#)
4 years 25 days
?Diff2Dates("ymd", #06/01/1998#, #06/26/2002#, True)
4 years 0 months 25 days
?Diff2Dates("d", #06/01/1998#, #06/26/2002#)
1486 days
?Diff2Dates("h", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
42 hours
?Diff2Dates("hns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
42 hours 47 minutes 33 seconds
?Diff2Dates("dhns", #01/25/2002 01:23:01#, #01/26/2002 20:10:34#)
1 day 18 hours 47 minutes 33 seconds
?Diff2Dates("ymd",#12/31/1999#,#1/1/2000#)
1 day
?Diff2Dates("ymd",#1/1/2000#,#12/31/1999#)
-1 day
?Diff2Dates("ymd",#1/1/2000#,#1/2/2000#)
1 day
'***************** Codice **************
Public Function Diff2Dates(Interval As String, Date1 As Date, Date2 As Date,
_
Optional ShowZero As Boolean = False) As Variant
'Description:   This function calculates the number of years,
'               months, days, hours, minutes and seconds between
'               two dates, as elapsed time.
'
'Inputs:    Interval:   Intervals to be displayed (a string)
'           Date1:      The lower date (see below)
'           Date2:      The higher date (see below)
'           ShowZero:   Boolean to select showing zero elements
'
'Outputs:   On error: Null
'           On no error: Variant containing the number of years,
'               months, days, hours, minutes & seconds between
'               the two dates, depending on the display interval
'               selected.
'           If Date1 is greater than Date2, the result will
'               be a negative value.
'           The function compensates for the lack of any intervals
'               not listed. For example, if Interval lists "m", but
'               not "y", the function adds the value of the year
'               component to the month component.
'           If ShowZero is True, and an output element is zero, it
'               is displayed. However, if ShowZero is False or
'               omitted, no zero-value elements are displayed.
'               For example, with ShowZero = False, Interval = "ym",
'               elements = 0 & 1 respectively, the output string
'               will be "1 month" - not "0 years 1 month".
On Error GoTo Err_Diff2Dates
   Dim booCalcYears As Boolean
   Dim booCalcMonths As Boolean
   Dim booCalcDays As Boolean
   Dim booCalcHours As Boolean
   Dim booCalcMinutes As Boolean
   Dim booCalcSeconds As Boolean
   Dim booSwapped As Boolean
   Dim dtTemp As Date
   Dim intCounter As Integer
   Dim lngDiffYears As Long
   Dim lngDiffMonths As Long
   Dim lngDiffDays As Long
   Dim lngDiffHours As Long
   Dim lngDiffMinutes As Long
   Dim lngDiffSeconds As Long
   Dim varTemp As Variant
   Const INTERVALS As String = "dmyhns"
'Check that Interval contains only valid characters
   Interval = LCase$(Interval)
   For intCounter = 1 To Len(Interval)
      If InStr(1, INTERVALS, Mid$(Interval, intCounter, 1)) = 0 Then
         Exit Function
      End If
   Next intCounter
'Check that valid dates have been entered
   If Not (IsDate(Date1)) Then Exit Function
   If Not (IsDate(Date2)) Then Exit Function
'If necessary, swap the dates, to ensure that
'Date1 is lower than Date2
   If Date1 > Date2 Then
      dtTemp = Date1
      Date1 = Date2
      Date2 = dtTemp
      booSwapped = True
   End If
   Diff2Dates = Null
   varTemp = Null
'What intervals are supplied
   booCalcYears = (InStr(1, Interval, "y") > 0)
   booCalcMonths = (InStr(1, Interval, "m") > 0)
   booCalcDays = (InStr(1, Interval, "d") > 0)
   booCalcHours = (InStr(1, Interval, "h") > 0)
   booCalcMinutes = (InStr(1, Interval, "n") > 0)
   booCalcSeconds = (InStr(1, Interval, "s") > 0)
'Get the cumulative differences
   If booCalcYears Then
      lngDiffYears = Abs(DateDiff("yyyy", Date1, Date2)) - _
              IIf(Format$(Date1, "mmddhhnnss") <= Format$(Date2,
"mmddhhnnss"), 0, 1)
      Date1 = DateAdd("yyyy", lngDiffYears, Date1)
   End If
   If booCalcMonths Then
      lngDiffMonths = Abs(DateDiff("m", Date1, Date2)) - _
              IIf(Format$(Date1, "ddhhnnss") <= Format$(Date2, "ddhhnnss"),
0, 1)
      Date1 = DateAdd("m", lngDiffMonths, Date1)
   End If
   If booCalcDays Then
      lngDiffDays = Abs(DateDiff("d", Date1, Date2)) - _
              IIf(Format$(Date1, "hhnnss") <= Format$(Date2, "hhnnss"), 0,
1)
      Date1 = DateAdd("d", lngDiffDays, Date1)
   End If
   If booCalcHours Then
      lngDiffHours = Abs(DateDiff("h", Date1, Date2)) - _
              IIf(Format$(Date1, "nnss") <= Format$(Date2, "nnss"), 0, 1)
      Date1 = DateAdd("h", lngDiffHours, Date1)
   End If
   If booCalcMinutes Then
      lngDiffMinutes = Abs(DateDiff("n", Date1, Date2)) - _
              IIf(Format$(Date1, "ss") <= Format$(Date2, "ss"), 0, 1)
      Date1 = DateAdd("n", lngDiffMinutes, Date1)
   End If
   If booCalcSeconds Then
      lngDiffSeconds = Abs(DateDiff("s", Date1, Date2))
      Date1 = DateAdd("s", lngDiffSeconds, Date1)
   End If
   If booCalcYears And (lngDiffYears > 0 Or ShowZero) Then
      varTemp = lngDiffYears & IIf(lngDiffYears <> 1, " years", " year")
   End If
   If booCalcMonths And (lngDiffMonths > 0 Or ShowZero) Then
      If booCalcMonths Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffMonths & IIf(lngDiffMonths <> 1, " months", "
month")
      End If
   End If
   If booCalcDays And (lngDiffDays > 0 Or ShowZero) Then
      If booCalcDays Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffDays & IIf(lngDiffDays <> 1, " days", " day")
      End If
   End If
   If booCalcHours And (lngDiffHours > 0 Or ShowZero) Then
      If booCalcHours Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffHours & IIf(lngDiffHours <> 1, " hours", " hour")
      End If
   End If
   If booCalcMinutes And (lngDiffMinutes > 0 Or ShowZero) Then
      If booCalcMinutes Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffMinutes & IIf(lngDiffMinutes <> 1, " minutes", "
minute")
      End If
   End If
   If booCalcSeconds And (lngDiffSeconds > 0 Or ShowZero) Then
      If booCalcSeconds Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffSeconds & IIf(lngDiffSeconds <> 1, " seconds", "
second")
      End If
   End If
   If booSwapped Then
      varTemp = "-" & varTemp
   End If
   Diff2Dates = Trim$(varTemp)
End_Diff2Dates:
   Exit Function
Err_Diff2Dates:
   Resume End_Diff2Dates
End Function
'************** fine *****************
Un mondo, un numero:
http://www.phone.my-pci.com


Questo l'adattamento in italiano dell'ottima funzione postata da UBI:
Public Function Diff2Dates(Interval As String, Date1 As Date, Date2 As Date, 

'************** Esempi ***************
'Print Diff2Dates("y", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("ymd", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("ymd", #6/1/1998#, #6/26/2002#, True)
'Print Diff2Dates("d", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("h", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("hns", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("dhns", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("ymd", #12/31/1999#, #1/1/2000#)
'Print Diff2Dates("ymd", #1/1/2000#, #12/31/1999#)
'Print Diff2Dates("ymd", #1/1/2000#, #1/2/2000#)
'***************** Fine esempi **************
On Error GoTo Err_Diff2Dates














      varTemp = lngDiffYears & IIf(lngDiffYears <> 1, " anni", " anno")
   End If
   If booCalcMonths And (lngDiffMonths > 0 Or ShowZero) Then
      If booCalcMonths Then
      varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
      lngDiffMonths & IIf(lngDiffMonths <> 1, " mesi", " Mese ")
      End If
   End If
   If booCalcDays And (lngDiffDays > 0 Or ShowZero) Then
      If booCalcDays Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffDays & IIf(lngDiffDays <> 1, " giorni", " giorno")
      End If
   End If
   If booCalcHours And (lngDiffHours > 0 Or ShowZero) Then
      If booCalcHours Then
         varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
                   lngDiffHours & IIf(lngDiffHours <> 1, " ore", " ora")
      End If
   End If
   If booCalcMinutes And (lngDiffMinutes > 0 Or ShowZero) Then
      If booCalcMinutes Then
      varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
      lngDiffMinutes & IIf(lngDiffMinutes <> 1, " minuti", " Minuto ")
      End If
   End If
   If booCalcSeconds And (lngDiffSeconds > 0 Or ShowZero) Then
      If booCalcSeconds Then
        varTemp = varTemp & IIf(IsNull(varTemp), Null, " ") & _
        lngDiffSeconds & IIf(lngDiffSeconds <> 1, " secondi", " Secondo ")
      End If
   End If
   If booSwapped Then
      varTemp = "-" & varTemp
   End If
   Diff2Dates = Trim$(varTemp)
End_Diff2Dates:
   Exit Function
Err_Diff2Dates:
   Resume End_Diff2Dates
End Function
'************** fine *****************
Ciao, Carlo 

 ha scritto:

Ciao Carlo,
ti è possibile mandarmi un esempio di una maschera per capire come
richiamare la funzione Diff2Dates
nella finestra immediata con i Vostri esempi vedo il risultato
non sò come collegare la funzione ed inserire i dati ed avere l'output in
una maschera
Grazie
Andrea Parrino
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Andrea Parrino
Prima di tutto i due campi nella tabella devono avere il formato data/time 
nel formato Data Generica.
I suddetti campi nella maschera vanno impostati con valore predefinito = 
Now()
Questo ti permetterà di avere sia la data che l'orario.
In alternativa puoi usare il codice: Me.MioControlloDataDa = Now()
Me.MioControlloDataA = Now()
Si possono usare anche quattro campi nella tabella: DataDa; DataA; OraDa; 
OraA
In questo caso quando chiami la funzione dovrai unire i due campi (DataDa; 
OraDa) e (DataA; OraA) se ti interessa anche il calcolo delle ore e dei 
minuti oltre che dei giorni altrimenti saranno sufficienti i due campi data.
Nel primo caso:
Me.MioControlloRisultatoDifferenzaTraDate = Diff2Dates("hns", 
Me.MiaDataeOrarioDa, Me.MiaDataeOrarioA)
il risultato sarà la differenza in ore, minuti e secondi.
Gli stessi valori ma con la differenza anche in giorni sarà:
Me.MioControlloRisultatoDifferenzaTraDate = Diff2Dates("dhns", 
Me.MiaDataeOrarioDa, Me.MiaDataeOrarioA)
Di seguito riporto gli esempi possibili.
'Print Diff2Dates("y", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("ymd", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("ymd", #6/1/1998#, #6/26/2002#, True)
'Print Diff2Dates("d", #6/1/1998#, #6/26/2002#)
'Print Diff2Dates("h", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("hns", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("dhns", #1/25/2002 1:23:01 AM#, #1/26/2002 8:10:34 PM#)
'Print Diff2Dates("ymd", #12/31/1999#, #1/1/2000#)
'Print Diff2Dates("ymd", #1/1/2000#, #12/31/1999#)
'Print Diff2Dates("ymd", #1/1/2000#, #1/2/2000#)
Ciao, Carlo 

 Me.MiaDataeOrarioDa, Me.MiaDataeOrarioA)
Nella casella di testo: MioControlloRisultatoDifferenzaTraDate
devo mettere sia il codice che mi hai dato che richiamare la funzione
Diff2Dates
è qui che mi perdo, mi potresti spiegare i passi esatti da compiere?


 ha scritto nel messaggio 
news:81Z73Z204Z199Y1...@usenet.libero.it...

La casella di testo: MioControlloRisultatoDifferenzaTraDate è tipicamente un 
controllo calcolato (e non associato) e comunque serviva solo per farti un 
esempio. Il controllo viene riempito via codice avendo i valori per il 
calcolo nei due o quattro controlli.
Esempio con due controlli + MioControlloRisultatoDifferenzaTraDate, al click 
di un pulsante:
Me.MioControlloRisultatoDifferenzaTraDate = Diff2Dates("hns",
Me.MiaDataeOrarioDa, Me.MiaDataeOrarioA)
La stessa funzione la puoi usare in una query. In questo caso ho usato una 
tabella TTimbrature che ha quattro campi: DataEntrata, OraEntrata, 
DataUscita, OraUscita.
SELECT TTimbrature.*, Diff2Dates("dhns",[DataEntrata] & " " & 
[OraEntrata],[DataUscita] & " " & [OraUscita]) AS TempoLavoro
FROM TTimbrature;
Ti è più chiaro?
Importante è stabilire cosa vuoi fare o meglio cosa vuoi ottenere.
Ciao, Carlo

Cut
Ti ho appena mandato un esempio alla posta privata.
Se dovesse servire posso inviarne una copia al richiedente o al SitoComune.
Ciao, Carlo 

 ha scritto:

Tutto chiaro.
Grazie 1000!!!
Bye
