> Also if you have any other ideas for generating random dates (YYYYMMDD)
overall, I would welcome your thoughts!

Bill,

DFSORT has plethora of date arithmetic/conversion functions that can get
you the desired results.   Here is a JCL that will generate dates for any
year that you provide.

You can pass 3 parms. The Begin-year , End year and Number of records.

The Begin-Year and End Year parameters are self explanatory.   The number
of records can either be a multiple of 365 or 366.   So if your number of
records have a value that does NOT end with year end date, then you can use
End year PARM to filter the records (Step0400)

//         EXPORT SYMLIST=*
//         SET BYEAR=1753
//         SET EYEAR=2019
//         SET NUMREC=310131
//**********************************************************************
//*  SET BYEAR   = NNNNNNNNNN   (VALID RANGE IS 1 TO 9999)             *
//*  SET EYEAR   = NNNNNNNNNN   (VALID RANGE IS 1 TO 9999)             *
//*  SET NUMREC  = NNNNNNNNNN   (REQUIRED NUMBER OF YEARS * 366)       *
//*                             (VALID RANGE 366 TO 3659634)           *
//*                                                                    *
//*  BYEAR , EYEAR AND NUMREC CAN BE PASSED WITH LEADING ZEROS UPTO 10 *
//*  10 DIGITS. ONLY THE FIRST 10 DIGITS YOU PASS ARE TAKEN INTO       *
//*  CONSIDERATION.                                                    *
//*                                                                    *
//*  EXAMPLE 01 :                                                      *
//*  SET BYEAR = 1753  AND NUMREC = 310131                             *
//*  WILL GENERATE DATE CALENDAR FROM 1753-01-01 TO 2601-12-31         *
//*                                                                    *
//*  EXAMPLE 02 :                                                      *
//*  SET BYEAR = 0001  AND NUMREC = 9999 * 366 = 3659634               *
//*  WILL GENERATE DATE CALENDAR FROM 0001-01-01 TO 9999-12-31         *
//*                                                                    *
//**********************************************************************
//**********************************************************************
//*  DELETE THE OUTPUT FILE IT EXISTS                                  *
//**********************************************************************
//STEP0100 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *,SYMBOLS=JCLONLY
  DELETE '&SYSUID..GENERATE.YEARDATA'
  SET MAXCC=0
//*
//**********************************************************************
//*  VALIDATE THE PASSED PARMS AND BUILD SYMBOLS                       *
//**********************************************************************
//STEP0200 EXEC PGM=SORT,
// PARM=('JP1"&BYEAR"',
//       'JP2"&NUMREC"',
//       'JP3"&EYEAR"')
//SYSOUT   DD SYSOUT=*
//SYMNOUT  DD SYSOUT=*
//SORTIN   DD *

//SORTOUT  DD DSN=&&S,DISP=(,PASS),SPACE=(TRK,(1,1),RLSE)
//SYSIN    DD *
  OPTION COPY
  INREC IFTHEN=(WHEN=INIT,BUILD=(01:JP1,11:JP2,21:JP3,80:X)),
  IFTHEN=(WHEN=INIT,BUILD=(01:01,10,UFF,M11,LENGTH=10,
                           11:11,10,UFF,M11,LENGTH=10,
                           21:21,10,UFF,M11,LENGTH=10)),

  IFTHEN=(WHEN=(01,10,ZD,EQ,0,OR,01,10,ZD,GT,9999),
  OVERLAY=(01:9C'0',C'1'),HIT=NEXT),
  IFTHEN=(WHEN=(11,10,ZD,LT,366,OR,11,10,ZD,GT,3659634),
  OVERLAY=(11:7C'0',C'366'),HIT=NEXT),
  IFTHEN=(WHEN=(21,10,ZD,EQ,0,OR,21,10,ZD,GT,9999),
  OVERLAY=(21:6C'0',DATE1),HIT=NEXT),
  IFTHEN=(WHEN=(21,10,ZD,LT,01,10,ZD),
  OVERLAY=(21:01,10),HIT=NEXT),
  IFTHEN=(WHEN=(01,10,ZD,GT,0,AND,01,10,ZD,LE,9999),
  OVERLAY=(40:((+9999,SUB,7,4,ZD),ADD,+1),
                MUL,+366,M11,LENGTH=10),HIT=NEXT),
  IFTHEN=(WHEN=(11,10,ZD,LT,40,10,ZD),
  OVERLAY=(40:11,10))
  OUTFIL BUILD=(C'BEGIN-YEAR,C''',07,4,C'''',/,
                C'END-YEAR,C''',27,4,C'''',/,
                C'RPT-VALUES,',43,7,80:X)
//*
//**********************************************************************
//*  GENERATE THE DATES FROM 0001-01-01 TO 9999-12-31                  *
//**********************************************************************
//STEP0300 EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SYMNAMES DD DISP=(OLD,PASS),DSN=&&S
//SYMNOUT  DD SYSOUT=*
//SORTIN   DD *

//SORTOUT  DD DSN=&&O1,DISP=(,PASS),SPACE=(CYL,(60,60),RLSE)
//SYSIN    DD *
  OPTION COPY
  OUTFIL REPEAT=RPT-VALUES,IFOUTLEN=10,
  IFTHEN=(WHEN=INIT,
         BUILD=(11:BEGIN-YEAR,C'0101',
                20:SEQNUM,8,ZD,START=0)),
  IFTHEN=(WHEN=INIT,
  OVERLAY=(11,8,Y4T,ADDDAYS,20,8,ZD,TOGREG=Y4T))
/*
//**********************************************************************
//*  EXTRACT THE RECORDS TO YEAR END AS PASSED NUMRECS CAN EXCEED      *
//*  BEYOND END YEAR                                                   *
//**********************************************************************
//STEP0400 EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SYMNAMES DD DISP=(OLD,PASS),DSN=&&S
//SYMNOUT  DD SYSOUT=*
//SORTIN   DD DISP=SHR,DSN=&&O1
//SORTOUT  DD DSN=&SYSUID..GENERATE.YEARDATA,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=SYSDA,
//            SPACE=(CYL,(60,60),RLSE)
//SYSIN    DD *
  OPTION COPY
  INCLUDE COND=(1,4,CH,GE,BEGIN-YEAR,AND,
                1,4,CH,LE,END-YEAR)
//*


Btw CBTAPE already has a calendar generation Job using DFSORT.   Check the
file 934.(Job Kolusu)  Here is a direct link to the file
http://www.cbttape.org/ftp/cbt/CBT934.zip

A Word of caution for people trying to run the calendar generation job with
competitor product, that the results will be wrong as their invalid date
processing logic is different from DFSORT.

It generates the following content.


//**********************************************************************
//*                                                                    *
//*  THE OUTPUT CALENDAR HAS THE FOLLOWING LAYOUT                      *
//*                                                                    *
//*  COL 01 - 08 : GREGORIAN DATE CCYYMMDD FORMAT                      *
//*  COL 09 - 10 : NUMBER OF DAYS REMAINING IN THAT PARTICULAR MONTH   *
//*  COL 11 - 12 : MAXIMUM NUMBER OF DAYS IN THAT PARTICULAR MONTH     *
//*  COL 13 - 13 : WEEKDAY NAME OCCURRENCE IN NUMERIC (1-5)             *
//*  COL 14 - 14 : REMAINING WEEKDAY NAME OCCURRENCE IN NUMERIC (1-4)   *
//*  COL 15 - 15 : TOTAL OCCURRENCES IN MONTH FOR THE WEEKDAY   (1-5)   *
//*  COL 16 - 18 : WEEKDAY NAME IN 3 CHARACTER FORMAT (MON,TUE...)     *
//*  COL 19 - 21 : JULIAN DAY OF THE YEAR (001 - 366)                  *
//*  COL 22 - 24 : REMAINING DAYS IN THIS YEAR (001 - 365)             *
//*  COL 25 - 25 : L = LEAP YEAR C = NON LEAP YEAR                     *
//*  COL 26 - 28 : WEEKDAY NAME OF FIRST DAY OF MONTH (MON,TUE...)     *
//*  COL 29 - 31 : WEEKDAY NAME OF LAST DAY OF MONTH (MON,TUE...)      *
//*  COL 32 - 38 : UNIQUE 7 BYTE SEQUENCE NUMBER                       *
//**********************************************************************


Thanks,
Kolusu
DFSORT Development
IBM Corporation


----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN

Reply via email to