Formattazione differenza tempi

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Formattazione differenza tempi

    Franco il problema non è la funzione isData quella è corretta; il tuo programma va in overflow in quanto la differenza, supera il limite stabilito dalla funzione DateDiff per i secondi.
    Considera che in un anno hai (a spanne) 365*24*60*60 = 31.536.000 secondi, Valuta il numero che si determina partendo dal 1955 all'anno attuale (ovvero almeno 67) e vedi il valore risultante (si supera quanto previsto per il tipo Long Integer ovvero +2,147,483,647)

  • Re: Formattazione differenza tempi

    E già Willy, …. allora banalmente si tira via le ore dal DateDiff per poi aggiungerle solo alla fine quando si va a ricostruire la stringa.
    Un pò come nella Function che hai presentato in precedenza.
    Verifico come fare… sempre utilizzando meno codice possibile per renderlo semplice e veloce.

    La piccola demo l'hai testata?  torna utile come function secondo te?

  • Re: Formattazione differenza tempi

    Come dice giustamente Willy serve gestire date inferiori spezzando i periodi…

    Tuttavia non trovo utile l'espressione in giorni… diciamo che sarebbe da complicare la funzione Per parametrizzare il formato del risultato.

  • Re: Formattazione differenza tempi

    Credo che per calcolare con più precisione un intervallo fra due date si debbano impiegare le funzioni che agiscono sul tipo di dato con cui si gestiscono le date (in quanto il valore di data/ora viene archiviato come numero).
    MS-Access archivia il tipo di dati Data/ora come numero a virgola mobile a precisione doppia fino a 15 posizioni decimali. La parte intera del numero a precisione doppia rappresenta la data. La parte decimale rappresenta l'ora.
    Quando si usa un formato di sola data (giorno, mese e anno) MS-Access archivia un valore pari a 0 per la parte relativa all'ora. 
    Quando si usa un formato per il solo orario (ore, minuti, secondi) MS-Access archivia un valore pari a 0 per la parte relativa alla data.
    I valori di data validi sono compresi tra -657.434 (1 gennaio 100 d.C.) e 2.958.465 (31 dicembre 9999 d.C.). Un valore per la data uguale a 0 rappresenta il 30 dicembre 1899. Access archivia le date precedenti al 30 dicembre 1899 come numeri negativi.
    I valori validi per l'ora sono compresi tra 0,0 (00.00.00) e 0,99999 (23.59.59). Il valore numerico rappresenta una frazione di un giorno. È possibile convertire il valore numerico in ore, in minuti e in secondi moltiplicando il valore numerico per 24.

    https://learn.microsoft.com/it-it/office/troubleshoot/access/store-calculate-compare-datetime-data

    Quindi è da suddividere le operazioni sulla sola data da quelle dell'orario, in modo da ricostruire le due porzioni (qualora si voglia presentare l'intervallo fra due date come numero di giorni, ore, minuti, secondi).

    Aggiungo, come nota (sulle possibili funzioni di conversione) la lettura del seguente documento:
    https://nolongerset.com/removing-time-in-vba/

  • Re: Formattazione differenza tempi

    03/06/2023 - willy55 ha scritto:


    Quindi è da suddividere le operazioni sulla sola data da quelle dell'orario, in modo da ricostruire le due porzioni (qualora si voglia presentare l'intervallo fra due date come numero di giorni, ore, minuti, secondi).

    Giusto Willy, infatti in prima battuta sono arrivato al massimo fino al 1899… tutto torna come dici tu.
    Adesso, capito che i limiti sono questi, voglio pensare ad una soluzione semplice semplice semplice…. 
    Con questo Qui verifico i risultati, speriamo che calcoli bene altrimenti mi fa sbagliare ;))

  • Re: Formattazione differenza tempi

    03/06/2023 - @Alex ha scritto:


    Come dice giustamente Willy serve gestire date inferiori spezzando i periodi…

    Tuttavia non trovo utile l'espressione in giorni… diciamo che sarebbe da complicare la funzione Per parametrizzare il formato del risultato.

    Esatto, ho già iniziato a spezzare ogni 60 anni la data da passare a DateDiff… provo a fare un piccolo loop per andare sotto al 1899. Ma lo voglio fare semplice il calcolo e solo con DateDiff. Mo' ci provo ;)

    Ormai lo preso come passatempo e ci perdo un po' di tempo ;)

  • Re: Formattazione differenza tempi

    Ciao Franco, ho implementato la seguente funzione che tratta l'intervallo (quale periodo intercorso fra due date, che sono i parametri da fornire). 
    Ho sfruttato la modalità di rappresentazione del formato data, ove la parte intera fornisce i giorni e la parte decimale l'orario (ore, miuti, secondi).
    Penso può essere una alternativa diretta che supera il vincolo della trasformazione del dato in secondi con conseguente errore di
    overflow. 
    L'ho buttata di getto, non ho effettuato un test affidabile ma magari puoi valutarla e adattarla a quanto hai proposto nel demo.

    Option Compare Database
    Option Explicit
    
    Public Function DiffGiorniOre(dteStart As Date, dteEnd As Date) As String
    '--------------------------------------------------------------------------------
    ' Funzione che date due date determina l'intervallo come differenza dei
    ' valori numerici di tipo Double ove la parte intera rappresenta i giorni
    ' e la parte decimale l'orario (ore, minuti, secondi).
    ' Restituisce il valore in formato Stringa espressa nella modalità
    ' dell'intervallo in: giorni, ore, minuti e secondi.
    '--------------------------------------------------------------------------------
    ' Function that you give two dates determines the interval as the difference of
    ' numeric values of type Double where the integer part represents the days
    ' and the decimal part the time (hours, minutes, seconds).
    ' Returns the value in String format expressed in the mode
    ' of the interval in: days, hours, minutes and seconds.
    '--------------------------------------------------------------------------------
    Dim dblStart As Double, dblEnd As Double
    Dim dblDiff2Date As Double
    Dim strGiornoOrario As String
    Dim dblParteDecimale As Double
    Dim intParteIntera As Integer
    Dim dblIntervalSec As Double
    dblStart = CDbl(dteStart)
    dblEnd = CDbl(dteEnd)
       
    ' Differenza delle due date come Intervallo di tempo trascorso (Time elapsed)
    dblDiff2Date = dblEnd - dblStart
    ' Debug.Print dblStart, dblEnd, dblDiff2Date
       
    intParteIntera = Int(dblDiff2Date)  ' La parte intera rappresenta il numero di giorni
    dblParteDecimale = (dblDiff2Date - intParteIntera) ' La parte decimale rappresenta l'orario (ore, minuti e secondi)
    ' Per semplicità il calcolo avviene con la conversione in secondi (For simplicity, convert to seconds)
    ' L'orario poteva anche essere calcolato con le apposite funzioni
    ' Esempio: Hour(dblParteDecimale) , Minute(dblParteDecimale)  , Secondi = Second(dblParteDecimale)
       
    dblIntervalSec = dblParteDecimale * 86400   '  La parte decimale viene rapportata al massimo dei secondi disponibilinella giornata (24 * 60 * 60 = 86400)
    ' Debug.Print "dblIntervalSec", dblIntervalSec
       
    ' Ora crea la stringa di testo del tempo trascorso (Now create a text string for the time elapsed)
    Select Case Int(dblIntervalSec)
       
       Case Is < 60
           strGiornoOrario = CInt(dblIntervalSec) & " sec"
       
       Case Is < 3600
           strGiornoOrario = CInt(dblIntervalSec \ 60) & " min " & CInt(dblIntervalSec Mod 60) & " sec"
           
       Case Is < 86400
           strGiornoOrario = CInt(dblIntervalSec \ 3600) & " ore " & CInt((dblIntervalSec Mod 3600) \ 60) & " min " & CInt(dblIntervalSec Mod 60) & " sec"
           
       Case Else
           strGiornoOrario = "Orario Non valido"
    End Select
    ' Valore restituito della funzione
    If intParteIntera > 0 Then
       '  Ciò assegna il numero dei giorni trascorsi (This gives the time elapsed with days
       DiffGiorniOre = intParteIntera & " giorni " & strGiornoOrario
    Else
       ' Solo orario ore, minuti, secondi (no giorni) Only hour, minute, seconds (no days)
       DiffGiorniOre = strGiornoOrario
    End If
    End Function
    
    Sub TestDiffGiorniOre()
    '  Esempio dati di prova (Example data values)
       Debug.Print "Differenza orario = " & DiffGiorniOre(#10/5/2017 9:13:04 AM#, #1/7/2018 11:34:27 PM#)
       Debug.Print "Differenza orario = " & DiffGiorniOre(#1/31/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
       Debug.Print "Differenza orario = " & DiffGiorniOre(#12/30/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
       Debug.Print "Differenza orario = " & DiffGiorniOre(#4/4/2023 10:20:30 AM#, #12/31/2023 10:20:40 PM#)
       Debug.Print "Differenza orario = " & DiffGiorniOre(#1/1/2023 11:59:58 PM#, #12/31/2023 11:59:59 PM#)
    End Sub
  • Re: Formattazione differenza tempi

    04/06/2023 - willy55 ha scritto:


    Ciao Franco, ho implementato la seguente funzione che tratta l'intervallo (quale periodo intercorso fra due date, che sono i parametri da fornire). 
    Ho sfruttato la modalità di rappresentazione del formato data, ove la parte intera fornisce i giorni e la parte decimale l'orario (ore, miuti, secondi).
    Penso può essere una alternativa diretta che supera il vincolo della trasformazione del dato in secondi con conseguente errore di
    overflow. 
    L'ho buttata di getto, non ho effettuato un test affidabile ma magari puoi valutarla e adattarla a quanto hai proposto nel demo.

    Domani la testo e la integro nella demo aggiungendo anche Optional parameters se si vuole anche il numero dei giorni nella stringa risultante.

    Grazie Willy!!!

  • Re: Formattazione differenza tempi

    04/06/2023 - willy55 ha scritto:


    Ciao Franco, ho implementato la seguente funzione che tratta l'intervallo (quale periodo intercorso fra due date, che sono i parametri da fornire). 
    Ho sfruttato la modalità di rappresentazione del formato data, ove la parte intera fornisce i giorni e la parte decimale l'orario (ore, miuti, secondi).
    Penso può essere una alternativa diretta che supera il vincolo della trasformazione del dato in secondi con conseguente errore di
    overflow. 
    L'ho buttata di getto, non ho effettuato un test affidabile ma magari puoi valutarla e adattarla a quanto hai proposto nel demo.

    Approccio sicuramente intelligente ed interessante, per standard non avrei inserito le 3 opzioni(Case Is < 60/3600/86400) per assenza di hh:mm:ss, ma avrei lasciato solo il calcolo completo visualizzando nel caso gli ZERI la dove ci fossero, anche se è pur vero che questo risultato in sostanza non ha finalità matematiche di conto ma solo rappresentative… quindi ognuno la personalizza a seconda dell'uso grafico necessario.

    strGiornoOrario = CInt(dblIntervalSec \ 3600) & " ore " & CInt((dblIntervalSec Mod 3600) \ 60) & " min " & CInt(dblIntervalSec Mod 60) & " sec"
  • Re: Formattazione differenza tempi

    Non ci ho messo mano … ma domani voglio rifinire la demo e la Function con qualche opzione in più di come si vuole rappresentare il valore di ritorno… 

    Metto insieme le considerazioni di @Alex e Willy … che sicuramente mi cazzieranno se sbaglio qualcosa :) 

    Cmq l'intento è di avere una Function utile e performante da poter utilizzare in diversi scenari.
    Vediamo se viene fuori qualcosa di utile.

    :)

  • Re: Formattazione differenza tempi

    Avevo fatto un demo di una classe per il calcolo dei Giorni Lavorativi che consente di implementare i giorni Festivi Custom Locali, nella classe ho aggiunto la funzione di Willy, a cui ho apportato la modifica di far calcolare sempre a prescindere d/h/m/s anche nel caso di valore=0

    Nel demo in basso a Sx c'è la Label che espone il calcolo, anche se il dato di ingresso non contiene hh/mm/ss, ma è per mostrare come integrato nella Classe.

    Nel Modulo base ho implementato anche una funzione che può essere richiamata da Origine Controllo o come UDF in una Query.

    https://1drv.ms/u/s!Are2sGzrs4WCqFu8QyNkh7F0UtLL?e=ox7m7H

    Ovviamente può essere migliorato… ma nel contesto trovo la classe estremamente funzionale all'uso… ed implementare Metodi utili è interessante.

    Spero possa servire.

  • Re: Formattazione differenza tempi

    08/06/2023 - @Alex ha scritto:


    Avevo fatto un demo di una classe per il calcolo dei Giorni Lavorativi che consente di implementare i giorni Festivi Custom Locali, nella classe ho aggiunto la funzione di Willy, a cui ho apportato la modifica di far calcolare sempre a prescindere d/h/m/s anche nel caso di valore=0

    Nel demo in basso a Sx c'è la Label che espone il calcolo, anche se il dato di ingresso non contiene hh/mm/ss, ma è per mostrare come integrato nella Classe.

    Nel Modulo base ho implementato anche una funzione che può essere richiamata da Origine Controllo o come UDF in una Query.

    https://1drv.ms/u/s!Are2sGzrs4WCqFu8QyNkh7F0UtLL?e=ox7m7H

    Ovviamente può essere migliorato… ma nel contesto trovo la classe estremamente funzionale all'uso… ed implementare Metodi utili è interessante.

    Spero possa servire.

    wow …. allora mi guardo pure questa… 

    grazie grande @Alex !

Devi accedere o registrarti per scrivere nel forum
26 risposte