Calcoli con orari

di il
4 risposte

Calcoli con orari

Ciao a tutti.
Volevo automatizzare alcuni calcoli di intervallo fra due orari Inizio e Fine (nel DB registro anche la relativa data).
Attualmente sto risolvendo con DateDiff, calcolando la differenza in minuti, ricavandone le ore e commutando i rimanenti minuti "centesimali" di access in sessagesimali umani.
Ad es Inizio 09.00 Fine 12.30 Totale 3h30'

Mi sto bloccando nel momento in cui Inizio e Fine capitano con cambio data (es Inizio 21.00 Fine 00.30 Totale -7h 0.3')
Come posso fare a risolvere?

Rimanendo in tema, cercando in rete per lo stesso motivo, mi sono imbattuto in un post datato 1998 (che per combinazione era stato fatto da un ex collega di ufficio, ormai in pensione da anni e di cui ho perso i contatti), con una funzione che fa la stesso calcolo (ma non risolve i problema a cavallo delle date ):

Public Function CalcolaOrario(dataora)
    Dim Minuti
    Dim Ore
    
    CalcolaOrario = ""
    On Error Resume Next ' per prevenire dataora null
    
    Minuti = dataora * 24 * 60
    
    Ore = Minuti \ 60: Minuti = Minuti - Ore * 60
    
    CalcolaOrario = CStr(Ore) & ":" & IIf(Minuti < 10, "0", "") & CStr(Minuti)
    
    On Error GoTo 0
End Function

Per usarla ho dovuto dimensionare le due variabili, in quanto ho impostato la Option Explicit
In pratica si richiama con CalcolaOrario(Fine-Inizio) oppure CalcolaOrario(Inizio+Fine)
Non essendo state dimensionionate le variabili (stringhe, numeri, etc) non capisco come vengono passati e trattati i valori, e anche i calcoli che fa....
Credo che la funzione restituisca il valore come stringa, visto che alla fine usa un CStr.
Vorrei "capirla", ma non ci riesco.
Se qualcuno me la spiegasse, lo apprezzerei.

Grazie

Andrea

4 Risposte

  • Re: Calcoli con orari

    Devi avere la Data per usare in modo giusto il DateDiff..., ovvero se la DataFine è il giorno dopo... il DateDiff restituisce il valore corretto, se invece usi DateDiff senza la parte del GG allora devi costruirla tu...,sarebbe meglio avere il TimeStamp completo, con DateSerial e la dove vedi che HOUR(Fine)<HOUR(Inizio) aggiungi 1gg...
    
    Dim TuaDataInizio As Date
    Dim TuaDataFine As Date
    Dim lngSec As Long
    Dim ValoreHHMMSS As String
    TuaDataInizio=#01/01/2022#
    TuaDataFine=DateAdd("d",-Hour(OraFine)<Hour(OraInizio),TuaDataInizio)
    TuaDataInizio=TuaDataInizio + cdate(TuaOraInizio)
    TuaDataFine=TuaDataFine + cdate(TuaOraFine)
    lngSec=DateDiff("s",TuaDataInizio,TuaDataFine)
    ValoreHHMMSS=Format(lngSec/86400,"hh:mm:ss")  ' Converti i secondi in gg e sfrutti Format per fare il resto
    
  • Re: Calcoli con orari

    Grazie della dritta.
    Lunedi quando torno in ufficio me la spulcio per bene e cerco di ottenere il risultato sperato

    Andrea
  • Re: Calcoli con orari

    Tempo fà mi sono imbattuto nello stesso problema. Alla fine ho ritenuto utile lavorare con il fomato string realizzando la seguente funzione, se ti può essere d'aiuto:
    
    Public Function diff_orario(ByVal time1 As String, ByVal time2 As String) As String
    
    Dim ns_time1        As Long
    Dim ns_time2        As Long
    Dim nH              As Long
    Dim nm              As Long
    Dim diff_s          As Long
    Dim ore             As String
    Dim min             As String
    
    ns_time1 = (CLng(Left$(Format(time1, "hh:nn"), 2)) * 3600) + (CLng(Right$(Format(time1, "hh:nn"), 2)) * 60) ' numero secondi nel primo valore orario
    
    ns_time2 = (CLng(Left$(Format(time2, "hh:nn"), 2)) * 3600) + (CLng(Right$(Format(time2, "hh:nn"), 2)) * 60) ' numero secondi nel secondo valore orario
    
    diff_s = ns_time1 - ns_time2    ' numero secondi della differenza
    nH = Int(diff_s / 3600)         ' numero di ore della differenza
    nm = (diff_s Mod 3600) / 60 ' numero di minuti della differenza
    
    If nH < 9 Then
        ore = "0" & CStr(nH)
    Else
        ore = CStr(nH)
    End If
    
    If nm < 9 Then
        min = "0" & CStr(nm)
    Else
        min = CStr(nm)
    End If
    
    diff_orario = ore & ":" & min
    
    End Function
    la funzione restituisce un risultato nel formato del tipo "00:00" senza secondi, ma può riarrangiare come meglio ti pare.
    Per correttezza devo dire, però, che mi sono ispirato ad un metodo già suggerito da un autore da quanche parte nel web di cui non ricordo.
  • Re: Calcoli con orari

    Ringrazio anche te per il suggerimento

    Andrea
Devi accedere o registrarti per scrivere nel forum
4 risposte