01/06/2023 - @Alex ha scritto:
Segui attentamente questo 3D
https://www.iprogrammatori.it/forum-programmazione/access/somma-di-numeri-del-tipo-ore-minuti-t51931.html
Ciao @Alex, approfitto del tuo sapere se posso ;)
in merito all'argomento di questi giorni, riferito alla differenza tra due Date Time di inizio e fine, al fine di ricavare quante Ore/Minuti/secondi sono intercorsi tra i due periodi, avrei pensato di buttar giù due righe di codice di questo tipo:
' RETURN STRING IN THE FORMAT “hh:mm:ss” THAT REPRESENTS
' THE NUMBER OF HOURS/MINUTES/SECONDS BETWEEN TWO DATES AND TIME
Function MyDiffTime(dStart As Date, dEnd As Date) As Variant
Dim lngHh, lngMm, lngSs As Long
' error check parameters
If dStart > dEnd Then
MyDiffTime = False
Else
' retrieve total seconds
lngSs = DateDiff("s", dStart, dEnd)
' calculate minutes and seconds
If lngSs > 59 Then
lngMm = lngSs \ 60
lngSs = lngSs - (lngMm * 60)
End If
' calculate hours and minutes
If lngMm > 59 Then
lngHh = lngMm \ 60
lngMm = lngMm - (lngHh * 60)
End If
' return value
MyDiffTime = IIf(lngHh = 0, "0", CStr(lngHh)) & ":" & Right("00" & CStr(lngMm), 2) & ":" & Right("00" & CStr(lngSs), 2)
End If
End Function
Ho fatto dei test, ne riporto alcuni dove si vedono i valori di ritorno e il formato adottato per rappresentare il tempo trascorso.
Il valore di ritorno è di tipo Variant in modo da poter valutare False per date incongruenti per il confronto e per avere una Stringa che contiene il risultato del confronto… (magari potevo anche ritornare al posto di False il VbNullString, ma quest'ultimo, in prima battuta, potrebbe essere considerato come nessun tempo di differenza trascorso…)
Esempio:
Sub myTestTimeDiff()
Debug.Print MyDiffTime("01/06/2023 08:00:00", "31/05/2023 08:00:00") ' = False
Debug.Print MyDiffTime("01/06/2023 08:59:59", "01/06/2023 09:00:00") ' = 0:00:01
Debug.Print MyDiffTime("01/06/2023 08:30:30", "01/06/2023 08:30:35") ' = 0:00:05
Debug.Print MyDiffTime("01/06/2023 08:00:00", "01/06/2023 08:55:25") ' = 0:55:25
Debug.Print MyDiffTime("01/06/2023 08:30:30", "01/06/2023 10:00:00") ' = 1:29:30
Debug.Print MyDiffTime("01/06/2023 08:45:05", "01/06/2023 23:00:05") ' = 14:15:00
Debug.Print MyDiffTime("01/06/2023 08:45:05", "01/06/2023 08:45:05") ' = 0:00:00
Debug.Print MyDiffTime("01/06/2023 08:45:05", "02/06/2023 08:45:05") ' = 24:00:00
Debug.Print MyDiffTime("01/06/2023 08:45:05", "02/06/2023 23:00:05") ' = 38:15:00
Debug.Print MyDiffTime("01/06/2023 08:00:00", "01/07/2023 23:05:05") ' = 735:05:05
Debug.Print MyDiffTime("01/01/2023 00:00:00", "31/12/2023 23:59:59") ' = 8759:59:59
End Sub
Fatta eccezione della funzione DateDiff, per ricavare il totale numero di secondi intercorsi, non ho utilizzato volutamente altre funzioni per il trattamento delle date/time per diversi motivi e pensando anche di semplificare il calcolo.
Per esempio si poteva utilizzare il DataSerial… ma purtroppo i parametri da passare alla funzione sono di tipo Integer e se si supera i 32.767 secondi si riceve ovviamente l'errore di Overflow e questo comporterebbe dei limiti per i calcoli della Function.
L'unica cosa che non ho trovato trattabile, con il tipo variabile Date, sono le ore 24:00:00, ci si ferma alle 23:59:59 :(
Forse trattando Time nella forma AM e PM, ma non ho verificato.
Secondo te come approccio ed esecuzione può andar bene la Function oppure si può semplificare e seguire strade diverse con un approccio diverso?
Grazie!