MVSFORUMS.com Forum Index MVSFORUMS.com
A Community of and for MVS Professionals
 
 FAQFAQ   SearchSearch   Quick Manuals   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

converting date from yyyymmdd format to yyyyddd format

 
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Utilities
View previous topic :: View next topic  
Author Message
akhilraj2005
Beginner


Joined: 23 Mar 2005
Posts: 12
Topics: 3

PostPosted: Wed Mar 23, 2005 7:42 am    Post subject: converting date from yyyymmdd format to yyyyddd format Reply with quote

Is there any way of converting YYYYMMDD format in YYYYDDD format so that i can bring it to 'cyyddd' format as an input to DT1.
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Wed Mar 23, 2005 12:00 pm    Post subject: Reply with quote

akhilraj2005,

It can be done but involves too many arthimetic functions. I will post something later this afternoon.

Kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
akhilraj2005
Beginner


Joined: 23 Mar 2005
Posts: 12
Topics: 3

PostPosted: Wed Mar 23, 2005 1:11 pm    Post subject: Reply with quote

kolusu,
I missed to mention that i need a SORT/ICETOOL solution for this. thanks
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Wed Mar 23, 2005 2:41 pm    Post subject: Reply with quote

The following DFSORT/ICETOOL JCL will give you the desired results. If you have syncsort at your shop then change the pgm name to Synctool.

I assumed that your input file is of FB recfm and has an LRECL of 80 bytes. The date field(CCYYMMDD) starts at pos 1.

A brief explanation of the job.calculating the no:of days in julian format needs the year portion to be checked for a leap year. Once you figure that out it is very easy to calculate the julian date.

So we take the year and divide it by 4,100 and 400 and get the remainder on the inrec fields.

Now using a change command on OUTREC FIELDS we change the remainder to "L" if the remainder is a zero. we also add the max date of every month as a single string at the end of every record. We also subtract 1 from the month of the date field.

Using another change command on the OUTFIL OUTREC, we change the max date of february from 28 to 29 if the year is a leap year.

using another change command on the OUTFIL OUTREC, we add a series of '1's and '0's depending on the month.

for ex:
Code:

MONTH       Max date

Jan           31
Feb           28/29
Mar           31
Apr           30
May           31
Jun           30
Jul           31
Aug           31
Sep           30
Oct           31
Nov           30
Dec           31


Let us take current date as example. today is 2005-03-23. So subtracting 1 from month portion results in 2. so need to add up the max date of jan and feb and days in march to get the day of the year.

so we create a string of 0's and 1's depending on the month for a length of 12 bytes.

Code:

00    000000000000
01    100000000000
02    110000000000
03    111000000000
04    111100000000
05    111110000000
06    111111000000
07    111111100000
08    111111110000
09    111111111000
10    111111111100
11    111111111110


The next copy step , now multiples this string with max date of everymonth and adds them up together. It also adds the days of the date field to get the day of the year.

Code:
 
//STEP0100 EXEC PGM=ICETOOL                             
//TOOLMSG  DD SYSOUT=*                                   
//DFSMSG   DD SYSOUT=*                                   
//IN       DD *                                         
21000101                                                 
20000202                                                 
20020303                                                 
20030404                                                 
20040505                                                 
20050323                                                 
20060606                                                 
20070707                                                 
20080808                                                 
20090909                                                 
20101010                                                 
20111111                                                 
20121212                                                 
//T1       DD DSN=&T1,DISP=(,PASS),SPACE=(CYL,(X,Y),RLSE)
//OUT      DD SYSOUT=*                                             
//TOOLIN   DD *                                                   
  COPY FROM(IN) USING(CTL1)                                       
  COPY FROM(T1) USING(CTL2)                                       
//CTL1CNTL DD *                                                   
  INREC FIELDS=(1,80,                                             
                1,4,ZD,SUB,(+4,MUL,(1,4,ZD,DIV,+4)),EDIT=(T),     
                X,                                                 
                1,4,ZD,SUB,(+100,MUL,(1,4,ZD,DIV,+100)),EDIT=(TTT),
                X,                                                 
                1,4,ZD,SUB,(+400,MUL,(1,4,ZD,DIV,+400)),EDIT=(TTT))
  OUTREC FIELDS=(1,80,                                             
                 81:81,1,CHANGE=(1,C'0',C'L'),NOMATCH=(C'N'),     
                 82:83,3,CHANGE=(1,C'000',C'L'),NOMATCH=(C'N'),   
                 83:87,3,CHANGE=(1,C'000',C'L'),NOMATCH=(C'N'),   
                 C'312831303130313130313031',                     
                 +1,SUB,5,2,ZD,EDIT=(TT))                         
  OUTFIL FNAMES=T1,                                               
  OUTREC=(01,80,                                                   
          84,02,                                                   
          83:81,3,CHANGE=(2,C'LLL',C'29',                         
                            C'LNN',C'29'),                         
                           NOMATCH=(86,2),                         
          88,20,                                                   
          108,02,CHANGE=(12,C'00',C'000000000000',                 
                            C'01',C'100000000000',                 
                            C'02',C'110000000000',                 
                            C'03',C'111000000000',                 
                            C'04',C'111100000000',                 
                            C'05',C'111110000000',                 
                            C'06',C'111111000000',                 
                            C'07',C'111111100000',                 
                            C'08',C'111111110000',                 
                            C'09',C'111111111000',                 
                            C'10',C'111111111100',                 
                            C'11',C'111111111110'),               
                            NOMATCH=(C'00'))                       
//CTL2CNTL DD *                           
  OUTFIL FNAMES=OUT,                     
  OUTREC=(01,80,                         
          01,4,                           
         (081,2,ZD,MUL,105,1,ZD),ADD,     
         (083,2,ZD,MUL,106,1,ZD),ADD,     
         (085,2,ZD,MUL,107,1,ZD),ADD,     
         (087,2,ZD,MUL,108,1,ZD),ADD,     
         (089,2,ZD,MUL,109,1,ZD),ADD,     
         (091,2,ZD,MUL,110,1,ZD),ADD,     
         (093,2,ZD,MUL,111,1,ZD),ADD,     
         (095,2,ZD,MUL,112,1,ZD),ADD,     
         (097,2,ZD,MUL,113,1,ZD),ADD,     
         (099,2,ZD,MUL,114,1,ZD),ADD,     
         (101,2,ZD,MUL,115,1,ZD),ADD,     
         (103,2,ZD,MUL,116,1,ZD),ADD,     
         (7,2,ZD),EDIT=(TTT))             
/*



Hope this helps...

Cheers

kolusu

PS: Frank might be able to show you a better way of calculating the remainder using MOD function.
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
akhilraj2005
Beginner


Joined: 23 Mar 2005
Posts: 12
Topics: 3

PostPosted: Thu Mar 24, 2005 5:25 am    Post subject: Reply with quote

Thanks Kolusu for your prompt solution. atleast it gave me some direction but Its looks very lengthy. actually i need to convert 3 dates at a go into yyyyddd format. I will have to repeat this for all these dates indivisually. I am wondering if we can do this with one control card and with less calculations.. Rolling Eyes may be frank would like to do this with MOD.
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Thu Mar 24, 2005 5:36 am    Post subject: Reply with quote

Quote:

actually i need to convert 3 dates at a go into yyyyddd format. I will have to repeat this for all these dates indivisually.


of course it is lengthy. We are replicating a programming function in sort. Why not go with a cobol or easytrieve program?

Quote:

may be frank would like to do this with MOD.


There will be very little change using the function MOD. In my prior post , I used the formula

Code:

remainder = (A - (B * int(A/B))


Instead of that you can use DFSORT's MOD function as shown below.

ex:
Code:

INREC FIELDS=(1,80,
              1,4,ZD,MOD,+4,TO=ZD,LENGTH=1,
              X,
              1,4,ZD,MOD,+100,TO=ZD,LENGTH=3,
              X,
              1,4,ZD,MOD,+400,TO=ZD,LENGTH=3)



Hope this helps....

Cheers

Kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
akhilraj2005
Beginner


Joined: 23 Mar 2005
Posts: 12
Topics: 3

PostPosted: Thu Mar 24, 2005 6:41 am    Post subject: Reply with quote

Thanks a lot Kolusu !! I would go for cobol/ eztrieve solution if situation complicates.
Back to top
View user's profile Send private message
superk
Advanced


Joined: 19 Dec 2002
Posts: 684
Topics: 5

PostPosted: Thu Mar 24, 2005 8:50 am    Post subject: Reply with quote

Just an FYI, it would be rather simple with a REXX exec:
Code:

/* REXX */                                       
datein = 20050324                                 
Parse Var datein ccyy 5 mm 7 dd 9 .               
dateddd  = Right(Date('D',datein,'S'),3,'0')     
Say datein '=' ccyy||dateddd                     
Exit 0                                           
Back to top
View user's profile Send private message
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Thu Mar 24, 2005 10:18 am    Post subject: Reply with quote

akhilraj2005,

Another variant in rexx

Code:

/* REXX */                                               
GREG_DATE     = 20050324                                 
DAY_OF_YEAR   = DATE('D',GREG_DATE,'S')                   
SAY JUL_DATE '=' SUBSTR(GREG_DATE,1,4)||DAY_OF_YEAR       


Easytrieve :

Code:

//STEP0100 EXEC PGM=EZTPA00                         
//STEPLIB  DD DSN=EASYTREV.LOADLIB,       
//            DISP=SHR                             
//PANDD    DD DSN=EASYTREV.MACLIB,       
//            DISP=SHR                             
//SYSOUT   DD SYSOUT=*                             
//SYSPRINT DD SYSOUT=*                             
//INFILE   DD *                                     
20050324                                           
21000301                                           
20040301                                           
//SYSIN    DD *                                     
  FILE INFILE                                       
       IN-DATE                  01 08 N 0           
                                                   
  WS-JUL-DATE                    W 07 N             

 JOB INPUT INFILE                                           
                                                             
  %DATECONV IN-DATE CCYYMMDD WS-JUL-DATE CCYYDDD THRESHOLD 50
                                                             
   DISPLAY  ' JULIAN DATE : ' WS-JUL-DATE                     


Cobol:

Code:

  WORKING-STORAGE SECTION.                                   
                                                             
  01 S-EOF-INFILE                PIC X(01)  VALUE 'N'.       
  01 WS-JULIAN-DATE              PIC 9(07).                   
                                                             
  PROCEDURE DIVISION.                                         
                                                             
      PERFORM 1000-INITIALIZATION                           
      PERFORM 2000-GET-JULIAN-DATE UNTIL S-EOF-INFILE = 'Y' 
      CLOSE INFILE                                           
                                                             
      GOBACK                                                 
      .                                                     
                                                             
  1000-INITIALIZATION.                                       
*************************************************************
*THIS PARAGRAPH OPENS AND DOES THE PRIME READ OF THE FILES. *
*************************************************************
       OPEN INPUT INFILE                                     
       PERFORM 3000-READ-INFILE                               
       .                                                     
                                                             
  2000-GET-JULIAN-DATE.                                       
*************************************************************
*THIS PARAGRAPH GETS THE JULIAN DATE FOR THE GREGORIAN DATE.*
*************************************************************
                                                             
       INITIALIZE WS-JULIAN-DATE                             
                                                             
       COMPUTE WS-JULIAN-DATE  = FUNCTION DAY-OF-INTEGER     
                                (FUNCTION INTEGER-OF-DATE     
                                 (IN-DATE))                   
                                                             
       DISPLAY 'THE JULIAN DATE IS : ' WS-JULIAN-DATE         
                                                             
       PERFORM 3000-READ-INFILE                               
       .                                                     
                                                             
  3000-READ-INFILE.                                           
*************************************************************
*THIS PARAGRAPH IS PERFORMED TO READ THE INPUT FILE.        *
*************************************************************
       READ INFILE                                           
         AT END                                               
            MOVE 'Y' TO S-EOF-INFILE                         
       END-READ                                               
       .                                                     


Hope this helps...

Cheers

kolusu
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
kolusu
Site Admin
Site Admin


Joined: 26 Nov 2002
Posts: 12375
Topics: 75
Location: San Jose

PostPosted: Mon Nov 16, 2009 2:26 pm    Post subject: Reply with quote

With z/OS DFSORT V1R5 PTF UK51706 or z/OS DFSORT V1R10 PTF UK51707, you can use the new date conversion function TOJUL like shown below to get the desired results
Code:

//STEP0100 EXEC PGM=SORT                 
//SYSOUT   DD SYSOUT=*                   
//SORTIN   DD *                         
20080229                                 
20081231                                 
20090229                                 
20091231                                 
//SORTOUT  DD SYSOUT=*                   
//SYSIN    DD *                         
  SORT FIELDS=COPY                       
  OUTREC OVERLAY=(20:1,8,Y4T,TOJUL=Y4T) 
//*                                     


The output is (2009-02-29 (feb 29 for non leap year is invalid)
Code:

20080229           2008060
20081231           2008366
20090229           *******
20091231           2009365



For complete details on date conversion functions and the other new functions available with the Nov, 2009 DFSORT PTF, see:

http://www.ibm.com/support/docview.wss?rs=114&uid=isg3T7000174
_________________
Kolusu
www.linkedin.com/in/kolusu
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view    MVSFORUMS.com Forum Index -> Utilities All times are GMT - 5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


MVSFORUMS
Powered by phpBB © 2001, 2005 phpBB Group