Calcolo durata fra due 'timestamp' in COBOL

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Calcolo durata fra due 'timestamp' in COBOL

    @willy55
    Scusa il ritardo con cui ti rispondo ... ma sono rientrato dalle ferie solo oggi.
    Hai ragione, circoscriviamo il problema ai dati da confrontare lasciando perdere tutte le considerazioni assicurative.

    Mi auto cito:
    in WS ho i seguenti campi:
    
    
    77  W-TZE-I           FORMAT TIME "%H.%M.%S" VALUE "00.00.00".
        03 W-DURADA         FORMAT DATE "%Y%m%d". 
        03 W-DURAA        FORMAT DATE "%Y%m%d".
        03 W-DA           FORMAT TIMESTAMP SIZE 19.   
        03 W-AL           FORMAT TIMESTAMP SIZE 19.
        03 W-MESI         PIC S9(5).
    
    Il valore di W-DURADA è "2020-01-01"
    Il valore di W-DURAA è "2022-01-01"
    il valore di W-DA è '2020-01-01-00.00.00'
    il valore di W-AL è '2021-12-31-23.59.00'

    e procedo al calcolo della durata:
    COMPUTE W-MESI   = 1 +                                   
               FUNCTION FIND-DURATION(W-DA W-AL MONTHS)
    
    Il valore di W-MESI risulta 01363 invece di 24. Perchè?
    Se il calcolo lo faccio direttamente fra W-DURADA e W_DURAA il valore che ottengo è 25 (12 mesi del '20, 12 mesii del '21' e Gennaio del '22 anche se per un solo giorno).
    Secondo me è un baco del compilatore: FIND-DURATION non funziona se calcolo la durata in MESI fra due 'timestamp' sia short (19 chr fino al secondo) sia long (26 chr fino al picosecondo). Mentre funziona fra due 'date'. Le altre combinazioni possibili non le ho provate.

    Grazie mille.
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    Una volta scrissi un programmino di inversione di una matrice che non funzionava.
    Mi misi con l'assistente ad analizzare il listato e non trovammo nessun errore, percio' la mia conclusione fu che c'era un errore nel compilatore.L'assistente era un po' scettico, ma io ero "sicuro".
    Il giorno dopo mi venne un'illuminazione che mi fece capire dove era l'errore.
    Qualche anno dopo su un libro di testo universitario lessi la frase "e' tipico dei programmatori poco esperti attribuire malfunzionamenti del suo programma a malfunzionamenti del sistema".
    Da allora e' diventata la mia regola di vita.
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    Dispiace comunque che la funzione abbia questo baco, dimenticavo di dire che se invece di chiedere il calcolo in mesi lo chiedo in giorni la FIND-DURATION dà sempre risultati corretti qualunque sia la combinazione di formati.
    Se la funzione avesse un baco, non dovrebbe essere MAI utilizzata.
    Meglio una cosa che si sa guasta, che una che funziona ad intermittenza.
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    Ho letto la documentazione di IBM e mi sono accorto di una nota che hanno messo che forse è proprio quella che rompe le scatole nel tuo caso.

    La documentazione che ho letto la trovi qui: https://www.ibm.com/docs/en/i/7.4?topic=functions-find-duration

    Alla fine della spiegazione, fa presente che:
    In order to determine the valid duration keywords, the following rules apply:
    - If argument-1 or argument-2 is a date item, the duration specified must be consistent with a date.
    - If argument-1 or argument-2 is a time item, the duration specified must be consistent with a time.
    - If the returned value is not an integer, it is truncated. For example, the duration between March 17, 1997 and May 2, 1997 is 1.5 months. Since FIND-DURATION only returns an integer the .5 would be truncated, and the actual value returned would be 1.
    - PICOSECONDS duration can only be requested when argument-1 and argument-2 are timestamp items.
    A parte che spiega bene il troncamento (cosa che può tornare comodo per i tuoi calcoli), non vorrei che il campo di tipo TIMESTAMP venga considerato come "time", per cui non ha senso parlare di giorni/mesi/anni ma solo di ore/minuti/secondi.

    In pratica:
    • Se passi due date, allora puoi usare YEAR, MONTH, DAY perchè sono delle frazioni di date
    • Se passi due timestamp (considerati come orari), allora puoi usare HOUR, MINUTE, SECONDS perchè sono frazioni di ora. Non puoi però usare YEAR, MONTH, DAY perchè non sono orari
    In questo caso, dovresti farti dare la differenza in minuti e poi farti tutti i calcoli a mano.
    In fin dei conti, nel tuo caso, credo anche che sia la cosa migliore: l'assicurazione è precisa al minuto, quindi tanto vale convertire tutto in quell'unità di misura e fare i calcoli.
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    Chissà quante assicurazioni sono state stipulate dal 09/08/2021 16:43 ad oggi ...
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    Azz... Non avevo notato che fosse un post così vecchio

    Ho selezionato "nuovi post" nel forum e leggendo "scusate ma sono rientrato dalle ferie" in uno degli ultimi post ho dato per scontato fossero cose di questi giorni visto che siamo di nuovo in periodo in cui tutti vanno in ferie...

    Mannaggia
  • Re: Calcolo durata fra due 'timestamp' in COBOL

    max.riservo ha scritto:


    Chissà quante assicurazioni sono state stipulate dal 09/08/2021 16:43 ad oggi ...
    Magari molte sbagliate.
Devi accedere o registrarti per scrivere nel forum
21 risposte