IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

Help with SORT - I need to validate date and timestamp


IBM Mainframe Forums -> DFSORT/ICETOOL
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
andy12

New User


Joined: 30 Apr 2020
Posts: 15
Location: United States

PostPosted: Thu Dec 26, 2024 8:48 am
Reply with quote

Hi, I have a requirement where my date and timestmap is coming in this format
Code:

 Input
12/21/2024-20.63.66.000000
12/22/2024-20.26.67.000000
12/23/2024-20.35.75.000000
12/21/2024-20.56.80.000000
 
 

I need to validate the hh.mm.ss and
- convert the Seconds, if its over 59 and increment it the minutes to 1 validate
- check minutes, if its over 59, then increment the hour by 1 and convert the rest as Minute

Code:

output
12/21/2024-21.04.06.000000
12/22/2024-20.27.07.000000
12/23/2024-20.36.15.000000
12/21/2024-20.57.20.000000



Thanks in advance.
Back to top
View user's profile Send private message
sergeyken

Senior Member


Joined: 29 Apr 2008
Posts: 2159
Location: USA

PostPosted: Thu Dec 26, 2024 6:49 pm
Reply with quote

Please, clarify you post:

1) Do you need an advise on the sequence of operations to produce your result? Or
2) Do you need your job to be done by someone else, and you were provided with a ready-to-copy-and-paste working code?

P.S.
From my primary school days I remember: the required process is called "rounding the time value"

P.P.S.
Do you need also to update the date value after your hours value becomes 24 or more? Such as:
12/31/2024-23.59.59.999999 -> 01/01/2025-00.00.00.000000
Back to top
View user's profile Send private message
sergeyken

Senior Member


Joined: 29 Apr 2008
Posts: 2159
Location: USA

PostPosted: Thu Dec 26, 2024 8:23 pm
Reply with quote

Some hints.

How to round the seconds value
Code:
 . . . . . . . . . . .
 IFTHEN=(WHEN=(21,6,ZD,GE,+500000),   add one second     
         OVERLAY=(18:18,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),     
         HIT=NEXT),
 IFTHEN=(WHEN=(21,6,ZD,GE,+0),        reset fractions of second 
         OVERLAY=(21:C'000000'),                                 
         HIT=NEXT),                                                                                   
 . . . . . . . . . . . .

How to add one day to the date value
Code:
 . . . . . . . . . . .
 IFTHEN=(WHEN=INIT,                                           
         OVERLAY=(81:7,4,1,2,4,2)),   MM/DD/YYYY->YYYYMMDD     
 IFTHEN=(WHEN=(12,2,ZD,GE,+24),       add one day         
         OVERLAY=(12:12,2,ZD,SUB,+24,TO=ZDF,LENGTH=2,     
                  1:81,8,Y4T,ADDDAYS,+1,TOGREG=Y4W(/)))   
 . . . . . . . . . . .
Back to top
View user's profile Send private message
andy12

New User


Joined: 30 Apr 2020
Posts: 15
Location: United States

PostPosted: Thu Dec 26, 2024 8:31 pm
Reply with quote

sergeyken wrote:
Please, clarify you post:

1) Do you need an advise on the sequence of operations to produce your result? Or
2) Do you need your job to be done by someone else, and you were provided with a ready-to-copy-and-paste working code?

P.S.
From my primary school days I remember: the required process is called "rounding the time value"

P.P.S.
Do you need also to update the date value after your hours value becomes 24 or more? Such as:
12/31/2024-23.59.59.999999 -> 01/01/2025-00.00.00.000000



Hi
I tried using the below approach using MOD but i'm getting error using MOD
Code:


OPTION COPY INREC IFTHEN=(WHEN=(1,2,CH,GE,C'24'),
           OVERLAY=(1:1,2,TO=ZD,MOD,24)),
        IFTHEN=(WHEN=(3,2,CH,GE,C'60'),
        OVERLAY=(3:1,2,TO=ZD,MOD,60), BUILD=(1,5,2,1,3,2,TO=ZD)),
   IFTHEN=(WHEN=(5,2,CH,GE,C'60'),
            OVERLAY=(5:1,2,TO=ZD,MOD,60), BUILD=(1,5,3,1,5,2))



Yes, i need to update my date as well accordingly. Thanks
Back to top
View user's profile Send private message
sergeyken

Senior Member


Joined: 29 Apr 2008
Posts: 2159
Location: USA

PostPosted: Thu Dec 26, 2024 8:41 pm
Reply with quote

andy12 wrote:
sergeyken wrote:
Please, clarify you post:

1) Do you need an advise on the sequence of operations to produce your result? Or
2) Do you need your job to be done by someone else, and you were provided with a ready-to-copy-and-paste working code?

P.S.
From my primary school days I remember: the required process is called "rounding the time value"

P.P.S.
Do you need also to update the date value after your hours value becomes 24 or more? Such as:
12/31/2024-23.59.59.999999 -> 01/01/2025-00.00.00.000000



Hi
I tried using the below approach using MOD but i'm getting error using MOD
Code:


OPTION COPY INREC IFTHEN=(WHEN=(1,2,CH,GE,C'24'),
           OVERLAY=(1:1,2,TO=ZD,MOD,24)),
        IFTHEN=(WHEN=(3,2,CH,GE,C'60'),
        OVERLAY=(3:1,2,TO=ZD,MOD,60), BUILD=(1,5,2,1,3,2,TO=ZD)),
   IFTHEN=(WHEN=(5,2,CH,GE,C'60'),
            OVERLAY=(5:1,2,TO=ZD,MOD,60), BUILD=(1,5,3,1,5,2))



Yes, i need to update my date as well accordingly. Thanks


Try with my hints
Back to top
View user's profile Send private message
andy12

New User


Joined: 30 Apr 2020
Posts: 15
Location: United States

PostPosted: Thu Dec 26, 2024 9:12 pm
Reply with quote

sergeyken wrote:
andy12 wrote:
sergeyken wrote:
Please, clarify you post:

1) Do you need an advise on the sequence of operations to produce your result? Or
2) Do you need your job to be done by someone else, and you were provided with a ready-to-copy-and-paste working code?

P.S.
From my primary school days I remember: the required process is called "rounding the time value"

P.P.S.
Do you need also to update the date value after your hours value becomes 24 or more? Such as:
12/31/2024-23.59.59.999999 -> 01/01/2025-00.00.00.000000



Hi
I tried using the below approach using MOD but i'm getting error using MOD
Code:


OPTION COPY INREC IFTHEN=(WHEN=(1,2,CH,GE,C'24'),
           OVERLAY=(1:1,2,TO=ZD,MOD,24)),
        IFTHEN=(WHEN=(3,2,CH,GE,C'60'),
        OVERLAY=(3:1,2,TO=ZD,MOD,60), BUILD=(1,5,2,1,3,2,TO=ZD)),
   IFTHEN=(WHEN=(5,2,CH,GE,C'60'),
            OVERLAY=(5:1,2,TO=ZD,MOD,60), BUILD=(1,5,3,1,5,2))



Yes, i need to update my date as well accordingly. Thanks


Try with my hints


Thanks. I dont need to convert my date. Just Hh:mm:ss is major
Back to top
View user's profile Send private message
sergeyken

Senior Member


Joined: 29 Apr 2008
Posts: 2159
Location: USA

PostPosted: Fri Dec 27, 2024 12:59 am
Reply with quote

Code:
//SYSIN    DD  *                                                       
 INREC IFTHEN=(WHEN=INIT,                                               
               OVERLAY=(81:7,4,1,2,4,2,    MM/DD/YYYY->YYYYMMDD         
                        28:C'<-',X,1,26)), copy original timestamp     
       IFTHEN=(WHEN=(21,6,ZD,GE,+500000),   add one second             
               OVERLAY=(18:18,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(21,6,ZD,GE,+0),        reset fractions of second   
               OVERLAY=(21:C'000000'),                                 
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(18,2,ZD,GE,+60),       add one minute             
               OVERLAY=(18:18,2,ZD,SUB,+60,TO=ZDF,LENGTH=2,             
                        15:15,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(15,2,ZD,GE,+60),       add one hour               
               OVERLAY=(15:15,2,ZD,SUB,+60,TO=ZDF,LENGTH=2,             
                        12:12,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(12,2,ZD,GE,+24),       add one day                 
               OVERLAY=(12:12,2,ZD,SUB,+24,TO=ZDF,LENGTH=2,             
                        1:81,8,Y4T,ADDDAYS,+1,TOGREG=Y4W(/)))           
 SORT FIELDS=COPY                                                       
 OUTREC BUILD=(1,80)                                                   
 END                                                                   
//*                                                                     


Code:
//SORTIN   DD  *                                               
02/28/2024-00.00.00.900000                                     
02/28/2024-23.50.59.800000                                     
02/28/2024-23.59.59.700000                                     
02/28/2023-23.59.59.600000                                     
12/31/2024-23.59.59.500000                                     
02/28/2024-00.00.00.111111                                     
02/28/2024-23.50.59.222222                                     
02/28/2024-23.59.59.333333                                     
02/28/2023-23.59.59.444444                                     
12/31/2024-23.59.59.000000                                     
//*-+----1----+----2----+----3----+----4----+----5----+----6   


Code:
********************************* TOP OF DATA ******************
02/28/2024-00.00.01.000000 <- 02/28/2024-00.00.00.900000       
02/28/2024-23.51.00.000000 <- 02/28/2024-23.50.59.800000       
02/29/2024-00.00.00.000000 <- 02/28/2024-23.59.59.700000       
03/01/2023-00.00.00.000000 <- 02/28/2023-23.59.59.600000       
01/01/2025-00.00.00.000000 <- 12/31/2024-23.59.59.500000       
02/28/2024-00.00.00.000000 <- 02/28/2024-00.00.00.111111       
02/28/2024-23.50.59.000000 <- 02/28/2024-23.50.59.222222       
02/28/2024-23.59.59.000000 <- 02/28/2024-23.59.59.333333       
02/28/2023-23.59.59.000000 <- 02/28/2023-23.59.59.444444       
12/31/2024-23.59.59.000000 <- 12/31/2024-23.59.59.000000       
******************************** BOTTOM OF DATA ****************
Back to top
View user's profile Send private message
andy12

New User


Joined: 30 Apr 2020
Posts: 15
Location: United States

PostPosted: Fri Dec 27, 2024 2:36 am
Reply with quote

sergeyken wrote:
Code:
//SYSIN    DD  *                                                       
 INREC IFTHEN=(WHEN=INIT,                                               
               OVERLAY=(81:7,4,1,2,4,2,    MM/DD/YYYY->YYYYMMDD         
                        28:C'<-',X,1,26)), copy original timestamp     
       IFTHEN=(WHEN=(21,6,ZD,GE,+500000),   add one second             
               OVERLAY=(18:18,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(21,6,ZD,GE,+0),        reset fractions of second   
               OVERLAY=(21:C'000000'),                                 
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(18,2,ZD,GE,+60),       add one minute             
               OVERLAY=(18:18,2,ZD,SUB,+60,TO=ZDF,LENGTH=2,             
                        15:15,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(15,2,ZD,GE,+60),       add one hour               
               OVERLAY=(15:15,2,ZD,SUB,+60,TO=ZDF,LENGTH=2,             
                        12:12,2,ZD,ADD,+1,TO=ZDF,LENGTH=2),             
               HIT=NEXT),                                               
       IFTHEN=(WHEN=(12,2,ZD,GE,+24),       add one day                 
               OVERLAY=(12:12,2,ZD,SUB,+24,TO=ZDF,LENGTH=2,             
                        1:81,8,Y4T,ADDDAYS,+1,TOGREG=Y4W(/)))           
 SORT FIELDS=COPY                                                       
 OUTREC BUILD=(1,80)                                                   
 END                                                                   
//*                                                                     


Code:
//SORTIN   DD  *                                               
02/28/2024-00.00.00.900000                                     
02/28/2024-23.50.59.800000                                     
02/28/2024-23.59.59.700000                                     
02/28/2023-23.59.59.600000                                     
12/31/2024-23.59.59.500000                                     
02/28/2024-00.00.00.111111                                     
02/28/2024-23.50.59.222222                                     
02/28/2024-23.59.59.333333                                     
02/28/2023-23.59.59.444444                                     
12/31/2024-23.59.59.000000                                     
//*-+----1----+----2----+----3----+----4----+----5----+----6   


Code:
********************************* TOP OF DATA ******************
02/28/2024-00.00.01.000000 <- 02/28/2024-00.00.00.900000       
02/28/2024-23.51.00.000000 <- 02/28/2024-23.50.59.800000       
02/29/2024-00.00.00.000000 <- 02/28/2024-23.59.59.700000       
03/01/2023-00.00.00.000000 <- 02/28/2023-23.59.59.600000       
01/01/2025-00.00.00.000000 <- 12/31/2024-23.59.59.500000       
02/28/2024-00.00.00.000000 <- 02/28/2024-00.00.00.111111       
02/28/2024-23.50.59.000000 <- 02/28/2024-23.50.59.222222       
02/28/2024-23.59.59.000000 <- 02/28/2024-23.59.59.333333       
02/28/2023-23.59.59.000000 <- 02/28/2023-23.59.59.444444       
12/31/2024-23.59.59.000000 <- 12/31/2024-23.59.59.000000       
******************************** BOTTOM OF DATA ****************


Thanks sergeyken. Appreciate your time and help.
Back to top
View user's profile Send private message
Joerg.Findeisen

Senior Member


Joined: 15 Aug 2015
Posts: 1353
Location: Bamberg, Germany

PostPosted: Thu Jan 02, 2025 12:58 pm
Reply with quote

Another method:
Code:
OPTION COPY                                                           
INREC IFTHEN=(WHEN=INIT,                                             
  OVERLAY=(41:7,4,1,2,4,2,81:18,4,UFF,ADD,+5,TO=ZDF,LENGTH=4,         
           50:(((12,2,ZD,MUL,+3600),ADD,                             
               15,2,ZD,MUL,+60),ADD,                                 
               81,3,ZD),TO=ZDF,LENGTH=6)),                           
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(57:50,6,ZD,DIV,+86400,TO=ZDF,LENGTH=1, * Days           
             50:50,6,ZD,MOD,+86400,TO=ZDF,LENGTH=6)),                 
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(58:50,6,ZD,DIV,+3600,TO=ZDF,LENGTH=2,  * Hours           
             50:50,6,ZD,MOD,+3600,TO=ZDF,LENGTH=6)),                 
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(60:50,6,ZD,DIV,+60,TO=ZDF,LENGTH=2,    * Minutes         
             62:50,6,ZD,MOD,+60,TO=ZDF,LENGTH=2)),  * Seconds         
  IFTHEN=(WHEN=(57,1,ZD,EQ,+1),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+1,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+2),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+2,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+3),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+3,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+4),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+4,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=NONE,                                                 
    BUILD=(1,26,X,C'->',X,41,8,Y4T,TOGREG=Y4W(/),                     
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)) 
END

Output sample:
Code:
12/21/2024-99.99.99.999999 -> 12/25/2024-04.40.40.000000
12/22/2024-20.26.67.987654 -> 12/22/2024-20.27.08.000000
12/23/2024-20.35.75.000000 -> 12/23/2024-20.36.15.000000
12/21/2024-20.56.80.000000 -> 12/21/2024-20.57.20.000000
12/31/2024-23.59.59.990000 -> 01/01/2025-00.00.00.000000
Back to top
View user's profile Send private message
sergeyken

Senior Member


Joined: 29 Apr 2008
Posts: 2159
Location: USA

PostPosted: Thu Jan 02, 2025 7:45 pm
Reply with quote

Joerg.Findeisen wrote:
Another method:
Code:
OPTION COPY                                                           
INREC IFTHEN=(WHEN=INIT,                                             
  OVERLAY=(41:7,4,1,2,4,2,81:18,4,UFF,ADD,+5,TO=ZDF,LENGTH=4,         
           50:(((12,2,ZD,MUL,+3600),ADD,                             
               15,2,ZD,MUL,+60),ADD,                                 
               81,3,ZD),TO=ZDF,LENGTH=6)),                           
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(57:50,6,ZD,DIV,+86400,TO=ZDF,LENGTH=1, * Days           
             50:50,6,ZD,MOD,+86400,TO=ZDF,LENGTH=6)),                 
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(58:50,6,ZD,DIV,+3600,TO=ZDF,LENGTH=2,  * Hours           
             50:50,6,ZD,MOD,+3600,TO=ZDF,LENGTH=6)),                 
  IFTHEN=(WHEN=INIT,                                                 
    OVERLAY=(60:50,6,ZD,DIV,+60,TO=ZDF,LENGTH=2,    * Minutes         
             62:50,6,ZD,MOD,+60,TO=ZDF,LENGTH=2)),  * Seconds         
  IFTHEN=(WHEN=(57,1,ZD,EQ,+1),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+1,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+2),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+2,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+3),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+3,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=(57,1,ZD,EQ,+4),                                       
    BUILD=(1,26,X,C'->',X,41,8,Y4T,ADDDAYS,+4,TOGREG=Y4W(/),         
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)),
  IFTHEN=(WHEN=NONE,                                                 
    BUILD=(1,26,X,C'->',X,41,8,Y4T,TOGREG=Y4W(/),                     
          58,6,ZD,EDIT=(STT.TT.TTS),SIGNS=(-,-,.,.),+0,ZD,LENGTH=6)) 
END


It really works, but...
9 conditional statements used, with tons of comparisons of non-obvious constants with non-obvious fields.
Quote:
It is more important the programs to be understandable by a human, rather than runnable by a computer!
358.gif
Back to top
View user's profile Send private message
Joerg.Findeisen

Senior Member


Joined: 15 Aug 2015
Posts: 1353
Location: Bamberg, Germany

PostPosted: Thu Jan 02, 2025 8:04 pm
Reply with quote

sergeyken wrote:
It really works, but...
9 conditional statements used, with tons of comparisons of non-obvious constants with non-obvious fields.
Quote:
It is more important the programs to be understandable by a human, rather than runnable by a computer!
358.gif

It is 6 comparisons if you omit the days 2..4, nothing more than your solution. icon_wink.gif
Back to top
View user's profile Send private message
andy12

New User


Joined: 30 Apr 2020
Posts: 15
Location: United States

PostPosted: Thu Jan 02, 2025 8:40 pm
Reply with quote

Thanks everyone for pitching in your inputs and thoughts. Appreciate it.
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> DFSORT/ICETOOL

 


Similar Topics
Topic Forum Replies
No new posts Sort to insert record in an empty file. DFSORT/ICETOOL 5
No new posts Partial Sort conditions for PD fields DFSORT/ICETOOL 16
No new posts JCL sort to compare dates in two file... DFSORT/ICETOOL 2
No new posts Is this possible via sort (in one pass)? SYNCSORT 4
No new posts GDG generation name to GDG Base name ... DFSORT/ICETOOL 3
Search our Forums:

Back to Top