Formattazione differenza tempi

di il
26 risposte

Formattazione differenza tempi

Buonasera a tutti,

uso la seguente espressione SQL in MS Access 365 per calcolare la differenza tra due tempi in secondi:

datediff("s", format(Sum([tempi].[tempi]), 'hh\:nn\:ss'), macchine.disponibilità)

Funziona correttamente ma mi resituisce un numero intero, per es. 3604. Io vorrei invece il risultato in formato hh:nn:ss, per esempio 1:00:04

Ho provato con la seguente espressione, ma mi restituisce sempre “00:00:00” :

 format(datediff("s", format(Sum([tempi].[tempi]), "hh\:nn\:ss"), macchine.disponibilità), "hh\:nn\:ss") 

Potete aiutarmi? Grazie

26 Risposte

  • Re: Formattazione differenza tempi

    Segui attentamente questo 3D

    https://www.iprogrammatori.it/forum-programmazione/access/somma-di-numeri-del-tipo-ore-minuti-t51931.html

  • Re: Formattazione differenza tempi

    Ciao

    vedere anche :

    Formattare un campo di data e ora - Supporto tecnico Microsoft

    Funzione TimeSerial - Supporto tecnico Microsoft

    Scegliere la funzione data giusta - Supporto tecnico Microsoft

  • Re: Formattazione differenza tempi

    Grazie, questa espressione (come suggerito dal tread) funziona:

    datediff('s', Format(Sum([tempi].[tempi]),'hh\:nn\:ss'), macchine.disponibilità))\60 & Format((datediff('n', Format(Sum([tempi].[tempi]),'hh\:nn\:ss'), macchine.disponibilità)) Mod 60, '\:00')

    ma restituisce ore e minuti: “01:00”. Mancano i secondi.

    Cmq grazie, farò qualche altro tentativo, credo di avere capito la logica…

  • Re: Formattazione differenza tempi

    01/06/2023 - DavidE ha scritto:


    Grazie, questa espressione (come suggerito dal tread) funziona:

    datediff('s', Format(Sum([tempi].[tempi]),'hh\:nn\:ss'), macchine.disponibilità))\60 & Format((datediff('n', Format(Sum([tempi].[tempi]),'hh\:nn\:ss'), macchine.disponibilità)) Mod 60, '\:00')

    ma restituisce ore e minuti: “01:00”. Mancano i secondi.

    Cmq grazie, farò qualche altro tentativo, credo di avere capito la logica…

    Molto dipende dal range di tempi che devi elaborare… se passi da giorno a giorno cambia tutto. se al massimo stai dentro un ora potrebbe andare anche bene… ma non sempre…  vedi per esempio se scavalchi le 23:59:59, in tal caso attenzione che non ti funzionerà più a meno che non ti porti dietro anche la data oltre l'orario.

  • Re: Formattazione differenza tempi

    01/06/2023 - By65Franco ha scritto:

    Molto dipende dal range di tempi che devi elaborare… se passi da giorno a giorno cambia tutto. se al massimo stai dentro un ora potrebbe andare anche bene… ma non sempre…  vedi per esempio se scavalchi le 23:59:59, in tal caso attenzione che non ti funzionerà più a meno che non ti porti dietro anche la data oltre l'orario.

    Chiaro Franco grazie, ma io faccio la differenza con disponibilità che è un valore in ore e minuti sempre inferiore alle 24 ore (per es. "14:00:00").

    Quindi non dovrei avere problemi.

  • Re: Formattazione differenza tempi

    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!

  • Re: Formattazione differenza tempi

    Io ho una fissa per il codice… e la scriverei così:

    Function MyDiffTime(dStart As Date, dEnd As Date) As Variant
        Dim lngSs   As Long
    
        MyDiffTime = False
        If dStart < dEnd Then
            lngSs = DateDiff("s", dStart, dEnd)
            MyDiffTime = Format$(lngSs \ 3600, "00") & ":" & Format$(lngSs Mod 60, "00") & ":" & Format$((lngSs Mod 60) Mod 60, "00")
        End If
    End Function

    Mi pare leggibile e mi pare restituisca il valore corretto… ed è più compatta.

    Che dici…?

    Non puoi usare i formati Date proprio perchè non consentono numeri per le h>23… si parte dai secondi per questo e per evitare gli arrotondamenti...

  • Re: Formattazione differenza tempi

    02/06/2023 - @Alex ha scritto:


    Io ho una fissa per il codice… e la scriverei così:

    Function MyDiffTime(dStart As Date, dEnd As Date) As Variant
        Dim lngSs   As Long
    
        MyDiffTime = False
        If dStart < dEnd Then
            lngSs = DateDiff("s", dStart, dEnd)
            MyDiffTime = Format$(lngSs \ 3600, "00") & ":" & Format$(lngSs Mod 60, "00") & ":" & Format$((lngSs Mod 60) Mod 60, "00")
        End If
    End Function

    Mi pare leggibile e mi pare restituisca il valore corretto… ed è più compatta.

    Che dici…?

    Non puoi usare i formati Date proprio perchè non consentono numeri per le h>23… si parte dai secondi per questo e per evitare gli arrotondamenti...

    La provo subito … mi sembra ottimo !!!

    ti faccio sapere ;)

  • Re: Formattazione differenza tempi

    02/06/2023 - By65Franco ha scritto:


    Mi pare leggibile e mi pare restituisca il valore corretto… ed è più compatta.

    Problema con i minuti… manca qualcosa ….. 

  • Re: Formattazione differenza tempi

    02/06/2023 - By65Franco ha scritto:


    02/06/2023 - By65Franco ha scritto:


    Mi pare leggibile e mi pare restituisca il valore corretto… ed è più compatta.

    Problema con i minuti… manca qualcosa ….. 

    Dovrebbe essere così …  giusto @Alex ?

    MyDiffTime = Format$(lngSs \ 3600, "00") & ":" & Format$(lngSs \ 60 Mod 60, "00") & ":" & Format$((lngSs Mod 60) Mod 60, "00")
  • Re: Formattazione differenza tempi

    Franco, ho effettato un test sulla tua funzione e mi pare corretta nei risultati.
    Se può esserti utile, come spunto, puoi anche vedere la funzione riportata nel seguente link che integra anche i giorni:
    https://www.access-programmers.co.uk/forums/threads/error-with-datediff.297718/
    e che riporto leggermente adattata:

    
    ' ******************************************************************************************+
    ' Tratto da: https://www.access-programmers.co.uk/forums/threads/error-with-datediff.297718/
    ' ******************************************************************************************+
    Public Function CheckTimeTaken(dteStart As Date, dteEnd As Date) As String
    ' Funzione che date due date determina l'intervallo come differenza dei
    ' valori numerici di tipo Double e restituisce il valore in formato Stringa
    ' espressa in: giorni, ore, minuti e secondi
    Dim dblStart As Double, dblEnd As Double
    Dim dblTimeTaken As Double
    Dim strTimeTaken As String
    dblStart = CDbl(dteStart)
    dblEnd = CDbl(dteEnd)
       
    dblTimeTaken = dblEnd - dblStart
       
    'Debug.Print dblStart, dblEnd, dblTimeTaken
       
    'This gives the time elapsed in days
    'For simplicity, convert to seconds
    dblTimeTaken = 86400 * dblTimeTaken
    'Debug.Print dblTimeTaken
       
    'now create a text string for the time elapsed
    Select Case dblTimeTaken
       
       Case Is < 60
           strTimeTaken = CInt(dblTimeTaken) & " seconds"
       
       Case Is < 3600
           strTimeTaken = CInt(dblTimeTaken \ 60) & " min " & CInt(dblTimeTaken Mod 60) & " sec"
           
       Case Is < 86400
           strTimeTaken = CInt(dblTimeTaken \ 3600) & " hr " & CInt((dblTimeTaken Mod 3600) \ 60) & " min " & CInt(dblTimeTaken Mod 60) & " sec"
           
       Case Is >= 86400
          ' strTimeTaken = "More than 24 hours!"
           strTimeTaken = CInt(dblTimeTaken \ 86400) & " day " & CInt((dblTimeTaken Mod 86400) \ 3600) & " hr " & CInt((dblTimeTaken Mod 3600) \ 60) & " min " & CInt(dblTimeTaken Mod 60) & " sec"
       
       Case Else
           strTimeTaken = "Not known"
           
    End Select
       
    CheckTimeTaken = strTimeTaken
    
    End Function
    
    Sub TestGetTimeTaken()
    'example values
        Debug.Print "Time taken = " & CheckTimeTaken(#10/5/2017 9:13:04 AM#, #1/7/2018 11:34:27 PM#)
    End Sub
  • Re: Formattazione differenza tempi

    Salve @Alex, Willy
    quando ieri Willy ha fatto presente che era utile utilizzare anche la data oltre il l'orario, e con la semplificazione di @Alex, ho fatto una piccola demo dove si può vedere come impostare i vari formati al campo del risultato frutto della differenza tra due date/time.

    Questo il Link in modo da testare la correttezza dei calcoli … se la verificate e se va bene chiudo e salvo la demo.
    https://1drv.ms/u/s!AmhOLXbgzapGrASOQ-bMGKpA1KBB?e=tFMRQ7

    Ho aggiunto anche una piccola Tabella e una Query con cui poter verificare, anche in questo caso, come utilizzare la funzione.


    Attendo vostro riscontro

  • Re: Formattazione differenza tempi

    Per esempio ;)  nel 2023 ci sono esattamente 8760 ore

    e nel 2024 ci sono esattamente 8784 ore

    Avrà tenuto conto dell' Ora Legale ?  ;))

  • Re: Formattazione differenza tempi

    @Alex !!!  Willy !!! e tutti gli altri…

    IsDate valida se la data è valida True/False

    Perchè non valida la Data Minima e Massima che si può trattare … per esempio una data con anno 1955 non restituisce errore mentre DateDiff non lo supporta.   E' un limite di Datadiff ?

Devi accedere o registrarti per scrivere nel forum
26 risposte