Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to do Time Calculations with milliseconds

10 views
Skip to first unread message

Lizette Koehler

unread,
Apr 8, 2021, 11:06:00 PM4/8/21
to
I have a CICS report that I need to add a Rsp time calculation.



The fields I have are

Start Time 2020/12/02 14:15:22.932039

Stop time 2020/12/02 14:15:31.499675





Response time = Stop time - start time

Response time = (2020/12/02 14:15:31.499675) - (2020/12/02 14:15:22.932039)

Response Time = 8.567636 seconds





I need a little guidance on the best way to do this calculation



What technique should be used?



Thank you

Lizette






----------------------------------------------------------------------
For TSO-REXX subscribe / signoff / archive access instructions,
send email to LIST...@VM.MARIST.EDU with the message: INFO TSO-REXX

Paul Gilmartin

unread,
Apr 8, 2021, 11:35:25 PM4/8/21
to
On 2021-04-08, at 21:05:44, Lizette Koehler wrote:
>
> I have a CICS report that I need to add a Rsp time calculation.
>
> Response time = Stop time - start time
> Response time = (2020/12/02 14:15:31.499675) - (2020/12/02 14:15:22.932039)
> Response Time = 8.567636 seconds
>
Rexx is grievously deficient here.
Use 86400 * ( date( Base, <Stop time>, Ordered ) - date( Base, <Start time>, Ordered ) ),
then painstakingly do the HH MM SS μs algebra.

(Supply a more challenging example -- different dates, even diferent years.)

Also, Rexx is timezone ignorant; not even GMT.

-- gil

WalterPachl

unread,
Apr 9, 2021, 2:22:31 AM4/9/21
to
> Paul Gilmartin <PaulGB...@AIM.COM> hat am 9. April 2021 um 05:35 geschrieben:
LG

Avec plaisir
/*
Response time = Stop time - start time
Response time = (2020/12/02 14:15:31.499675) - (2020/12/02 14:15:22.932039)
Response Time = 8.567636 seconds
*/
start='2020/12/02 14:15:22.932039'
end='2020/12/02 14:15:31.499675'
Numeric Digits 30
sms=ms(start)
ems=ms(end)
Say format((ems-sms)/1e6,3,6) 'seconds'
start='2020/12/31 23:59:59.999999'
end='2021/01/01 00:00:00.000000'
sms=ms(start)
ems=ms(end)
Say format((ems-sms)/1e6,3,6) 'seconds'
Exit
ms: Procedure
Parse Arg date hh':'mm':'ss'.'ms
od=space(translate(date,' ','/'),0)
bd=date(Base,od,'S')
s=(hh*60+mm)*60+ss
Return (86400*bd+s)*1e6+ms

Walter

Massimo Biancucci

unread,
Apr 9, 2021, 2:33:34 AM4/9/21
to
Lizette,

hereby two possible solutions with REXX and SORT.
In both cases I assumed TS in DB2 format YYYY-MM-DD-HH:MI:SS.uuuuuu

/* REXX */

NUMERIC DIGITS 18



PARSE ARG TS_STA TS_END



DT_STA = LEFT(TS_STA,4) !! SUBSTR(TS_STA,6,2) !! SUBSTR(TS_STA,9,2)

TM_STA = SUBSTR(TS_STA,12)

DT_END = LEFT(TS_END,4) !! SUBSTR(TS_END,6,2) !! SUBSTR(TS_END,9,2)

TM_END = SUBSTR(TS_END,12)



DT_STA_B = DATE("B",DT_STA,"S")

DT_END_B = DATE("B",DT_END,"S")

SAY DT_STA_B DT_END_B



TM_STA_B = TIME_BIN(TM_STA)

TM_END_B = TIME_BIN(TM_END)

SAY TM_STA_B TM_END_B



DT_DIFF_B = (DT_END_B - DT_STA_B) * 1440 * 60

TM_DIFF_B = TM_END_B - TM_STA_B

DELTA_TS = DT_DIFF_B + TM_DIFF_B



SAY DT_DIFF_B TM_DIFF_B DELTA_TS



EXIT



/*-------------------------------------------------------------------*/

TIME_BIN: PROCEDURE



IN = ARG(1)



PARSE VAR IN HH":"MI":"SS"."US



VAL = HH * 3600 + MI * 60 + SS + US/1000000



RETURN VAL



If you want you can solve the problem with SORT too (sorry for comments in
italian).

It's only a sample and the result value is at col 200 with edit
SSSSSSSSSS.uuuuuu.



//ST010 EXEC PGM=SORT

//SYSOUT DD SYSOUT=*

//SORTIN DD *

2020-12-02-14:15:22.9320392020-12-02-14:15:31.499675

2020-12-02-23:59:59.0000012020-12-03-00:00:01.000001

/*

//SORTOUT DD SYSOUT=*

//SYSIN DD *

*---------------------------------------------------------------------*

*IL FORMATO TS INTERNO ZOS (8 BYTES) E' CALCOLATO COME DIFFERENZA

*RISPETTO AL 1900-01-01-00.00.00.000000

*DEI 64 BITS IL BIT 51 RAPPRESENTA UN US (MICROSECONDO)

*DA CUI LA NECESSITA' DI DIVIDERE PER 4096 ALLA FINE

*---------------------------------------------------------------------*

*MODALITA' DI LAVORO:

* 1. COSTRUIAMO DAI TS IN FORMATO DB2 ESTERNO DELLE DATE IN FORMATO

* YYYYMMGG (FORMATO SORT=Y4T). LO POSIZIONIAMO A PARTIRE COLONNA 101

* 2. RICAVIAMO DA QUESTI DELLE DATE IN FORMATO GIULIANO YYYYGGG E LE

* POSIZIONIAMO A PARTIRE COLONNA 120

* 3. CALCOLIAMO CON DELLE MOLTIPLICAZIONI I VALORI DEI DELTA DEI DUE TS

* RISPETTO AL TS DI BASE (1900-01-01-00.00.00.000000)

* SOTTRAENDO 1900 DALL'ANNO E 1 DAL GIORNO.

* I FATTORI MOLTIPLICATIVI SONO QUELLI DEI MICROSECONDI * 4096

* CALCOLATI PER 1 SECONDO, 1 MINUTO, 1 ORA, 1 GIORNO ED UN ANNO.

* 4. CALCOLIAMO LA DIFFERENZA TRA I DUE TOD DI 8 BYTES E DIVIDIAMO

* IL VALORE PER 4096 PER OTTENERLO IN MICROSECONDI. PONIAMO IL

* VALORE A COLONNA 200 CON 10 INTERI (SECONDI) E 6 DECIMALI

* (MICROSECONDI).

*---------------------------------------------------------------------*

INREC IFTHEN=(WHEN=INIT,

OVERLAY=(101:1,4,6,2,9,2,27,4,32,2,35,2)), IN YYYYMMGG

IFTHEN=(WHEN=INIT,

OVERLAY=(120:101,8,Y4T,TOJUL=Y4T,109,8,Y4T,TOJUL=Y4T)), IN JUL

IFTHEN=(WHEN=INIT,

*YYYY*XX_IN_UN_ANNO +

*GGG*XX_IN_UN_GIORNO +

*HH*XX_IN_UN_ORA +

*MM*XX_IN_UN_MINUTO +

*SS*XX_IN_UN_SECONDO +

*US*XX_IN_UN_SECONDO

*DOVE XX=US_IN_UN_SECONDO * 4096

OVERLAY=(150:(120,4,ZD,ADD,-1900),MUL,+129171456000000000,ADD, 1 Y

(124,3,ZD,ADD,-1),MUL,+353894400000000,ADD, 1 D

12,2,ZD,MUL,+14745600000000,ADD, 1 H

15,2,ZD,MUL,+245760000000,ADD, 1 M

18,2,ZD,MUL,+4096000000,ADD, 1 S

21,6,ZD,MUL,+4096,TO=BI,LENGTH=8, 1 US

160:(127,4,ZD,ADD,-1900),MUL,+129171456000000000,ADD, 1 Y

(131,3,ZD,ADD,-1),MUL,+353894400000000,ADD, 1 D

38,2,ZD,MUL,+14745600000000,ADD, 1 H

41,2,ZD,MUL,+245760000000,ADD, 1 M

44,2,ZD,MUL,+4096000000,ADD, 1 S

47,6,ZD,MUL,+4096,TO=BI,LENGTH=8)), 1 US

IFTHEN=(WHEN=INIT,

OVERLAY=(200:(160,8,BI,SUB,150,8,BI),DIV,+4096,

TO=BI,LENGTH=8))

SORT FIELDS=COPY

OUTREC FIELDS=(1,207,200,8,BI,EDIT=('TTTTTTTTTT.TTTTTT'))

/*


Of course, please double check.


Best regards.

Max

<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Mail
priva di virus. www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

Il giorno ven 9 apr 2021 alle ore 08:22 WalterPachl <pa...@chello.at> ha
scritto:

Paul Gilmartin

unread,
Apr 9, 2021, 8:38:46 AM4/9/21
to
On 2021-04-09, at 00:33:11, Massimo Biancucci wrote:
>
> /* REXX */
>
> NUMERIC DIGITS 18
>
> /* ...
> -------------------------------------------------------------------*/
>
> TIME_BIN: PROCEDURE
> IN = ARG(1)
>
/* A suggestion: Don't separate microseconds since Rexx is capable
of dealin with decimal fractions. Allow the caller to specify
various precisions such as milliseconds or nanoseconds or seconds
with no decimal part.
Simply:
*/
> PARSE VAR IN HH":"MI":"SS
>
> VAL = HH * 3600 + MI * 60 + SS
>
> RETURN VAL

Seymour J Metz

unread,
Apr 9, 2021, 9:58:44 AM4/9/21
to
From whence do you derive the times to generate the report, and in what format?


--
Shmuel (Seymour J.) Metz
http://mason.gmu.edu/~smetz3

________________________________________
From: TSO REXX Discussion List [TSO-...@VM.MARIST.EDU] on behalf of Lizette Koehler [star...@MINDSPRING.COM]
Sent: Thursday, April 8, 2021 11:05 PM
To: TSO-...@VM.MARIST.EDU
Subject: [TSO-REXX] How to do Time Calculations with milliseconds
0 new messages