bill
Bill,
The simplest method is to convert both dates to julian dates (you can
find a routine in many books) and subtract giving the number of days.
Joe.
>Does anyone have an algorithm for calculating the number of days between
>two given dates? I've written one, but I'm wondering if there is something
>out there that is a little "cleaner". Thanks in advance.
>
>bill
Here's something I've posted awhile back. Please note the IBM
routines requires COBOL II or above to work:
Subject: Julian date and days difference routines - enjoy
From: bowil...@gems.vcu.edu (Boyce G. Williams, Jr.)
Date: 1996/06/21
Message-Id: <4qfcp2$2...@freenet.vcu.edu>
Newsgroups: comp.lang.cobol
[More Headers]
After reading all the requests for julian date conversions and number
of days difference between two dates, I decided to enclose a program I
wrote to compare the results of three methods: Tyler Welburn, Gary
DeWard Brown and myself (may I be so humble). I hope this may end
such requests and may encourage others to post their solutions.
Enjoy,
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. CBL0071.
000300 INSTALLATION. VIRGINIA COMMONWEALTH UNIVERSITY.
000400 AUTHOR. BOYCE G WILLIAMS, JR.
000500 DATE-WRITTEN. 06/21/96.
000600 DATE-COMPILED.
000700*
000800* COMPUTE JULIAN AND DAYS DIFFERENCE VIA:
000900* IBM'S INTRINSIC FUNCTIONS (GOOD FOR COBOL/390 )
001000* WELBURN (ADVANCED STRUCTURED COBOL - ISBN 0-87484-558-0 )
001100* BROWN (ADVANCED ANSI COBOL ... - ISBN 0-471-54786-7 )
001200*
001300* EXAMPLE OF RESULTS:
001400* TODAY'S DATE: 19960621
001500* TODAY'S JULIAN DATE: 96173
001600* FROM INTRINSIC FUNCTIONS: 1996173
001700* FROM WELBURN ROUTINE: 1996173
001800* FROM BROWN ROUTINE: 1996173
001900*
002000* SAMPLE FIRST DATE: 19950415
002100* NBR DAYS BETWEEN CURR AND FIRST DATES INCL
002200* VIA INTRINSIC: 0000434
002300* VIA WELBURN ROUTINE: 434
002400* VIA BROWN ROUTINE: 434
002500*
002600* COMPUTER DAY OF WEEK: FRIDAY
002700* WELBURN DAY OF WEEK: FRIDAY
002710*
002720* PATCHES: 7-23-97 WEL01-NBR-DAYS MADE NUMERIC
002730* ADDED "WEL02-GREG-NN > 2" CHECK TO
002740* "IF WEL02-LEAP-YEAR" CONDITIONAL
002800*
002900 ENVIRONMENT DIVISION.
003000*
003100 CONFIGURATION SECTION.
003200*
003300 SOURCE-COMPUTER. IBM-370.
003400 OBJECT-COMPUTER. IBM-370.
003500*
003600 DATA DIVISION.
003700*
003800 WORKING-STORAGE SECTION.
003900*
004000 01 WS-WORK-AREAS.
004100 05 WS-FIRST-DATE-A.
004200 10 WS-FIRST-DATE PIC 9(08)
004300 VALUE 19950415.
004400 05 WS-NBR-DAYS PIC Z(06).
004500*
004600 01 SYST-SYSTEM-DERIVED-CONTROL.
004700 05 SYST-JULI-DATE.
004800 10 SYST-JULI-DATE-YY PIC X(02).
004900 10 SYST-JULI-DATE-DDD PIC X(03).
005000 05 SYST-CURR-DATE.
005100 10 SYST-CURR-DATE-A.
005200 15 SYST-CURR-DATE-N PIC 9(08).
005300 10 FILLER PIC X(13).
005400 05 SYST-DAY PIC 9(01).
005500 05 SYST-DAY-DATA.
005600 10 FILLER PIC X(10) VALUE '1MONDAY '.
005700 10 FILLER PIC X(10) VALUE '2TUESDAY '.
005800 10 FILLER PIC X(10) VALUE '3WEDNESDAY'.
005900 10 FILLER PIC X(10) VALUE '4THURSDAY '.
006000 10 FILLER PIC X(10) VALUE '5FRIDAY '.
006100 10 FILLER PIC X(10) VALUE '6SATURDAY '.
006200 10 FILLER PIC X(10) VALUE '7SUNDAY '.
006300 05 FILLER REDEFINES SYST-DAY-DATA
006400 OCCURS 7 TIMES.
006500 10 SYST-DAY-N PIC 9(01).
006600 10 SYST-DAY-ENTRY PIC X(09).
006700*
006800 01 INTR-INTRINSIC-CONTROLS.
006900 05 INTR-GREG-DATE PIC 9(08).
007000 05 INTR-FIRST-DATE PIC 9(08).
007100 05 INTR-JULI-DATE PIC 9(07).
007200 05 INTR-LAST-DATE PIC 9(07).
007300 05 INTRS-FIRST-DATE PIC 9(07).
007400 05 INTR-NBR-DAYS PIC 9(07).
007500*
007600 01 BRN01-BROWN-NBR-DAYS-CONTROL.
007700 05 BRN01-FIRST-DATE.
007800 10 BRN01-FD-CCYY PIC 9(04).
007900 10 BRN01-FD-MM PIC 9(02).
008000 10 BRN01-FD-DD PIC 9(02).
008100 05 BRN01-LAST-DATE.
008200 10 BRN01-LD-CCYY PIC 9(04).
008300 10 BRN01-LD-MM PIC 9(02).
008400 10 BRN01-LD-DD PIC 9(02).
008500 05 BRN01-NBR-DAYS PIC S9(09) BINARY.
008600 05 BRN01-FIRST-YRNDAY.
008700 10 BRN01-FIRST-CCYY PIC 9(04).
008800 10 BRN01-FIRST-DDD PIC S9(04) BINARY.
008900 05 BRN01-LAST-YRNDAY.
009000 10 BRN01-LAST-CCYY PIC 9(04).
009100 10 BRN01-LAST-DDD PIC S9(04) BINARY.
009200 05 BRN01-HOLD-CCYY PIC 9(04).
009300 05 BRN01-DAYS-IN-YEAR PIC S9(04) BINARY.
009400 05 BRN01-LEAP-YEAR PIC S9(04) BINARY.
009500*
009600 01 BRN02-BROWN-JULIAN-DATE-CNTL.
009700 05 BRN02-CURRENT-DATE.
009800 10 BRN02-CD-CCYY PIC 9(04).
009900 10 BRN02-CD-MM PIC 99.
010000 10 BRN02-CD-DD PIC 99.
010100 05 BRN02-YRNDAY-DATE.
010200 10 BRN02-YRNDAY-CCYY PIC 9(04).
010300 10 BRN02-YRNDAY-DDD PIC 999.
010400 05 BRN02-DAYS-IN-YEAR PIC S9(04) BINARY.
010500 05 BRN02-LEAP-YEAR PIC S9(04) BINARY.
010600 05 BRN02-MONTH-DATA.
010700 10 FILLER PIC S9(04) BINARY VALUE 31.
010800 10 FILLER PIC S9(04) BINARY VALUE 28.
010900 10 FILLER PIC S9(04) BINARY VALUE 31.
011000 10 FILLER PIC S9(04) BINARY VALUE 30.
011100 10 FILLER PIC S9(04) BINARY VALUE 31.
011200 10 FILLER PIC S9(04) BINARY VALUE 30.
011300 10 FILLER PIC S9(04) BINARY VALUE 31.
011400 10 FILLER PIC S9(04) BINARY VALUE 31.
011500 10 FILLER PIC S9(04) BINARY VALUE 30.
011600 10 FILLER PIC S9(04) BINARY VALUE 31.
011700 10 FILLER PIC S9(04) BINARY VALUE 30.
011800 10 FILLER PIC S9(04) BINARY VALUE 31.
011900 05 FILLER REDEFINES BRN02-MONTH-DATA.
012000 10 BRN02-MONTH-ENTRY OCCURS 12 TIMES
012100 INDEXED BY BRN02-MX.
012200 15 BRN02-MONTH-DAYS PIC S9(04) BINARY.
012300*
012400 01 BRN03-BROWN-LEAP-YEAR-CONTROL.
012500 05 BRN03-TEMP-NUM PIC S9(04) BINARY.
012600 05 BRN03-THE-YEAR PIC 9(04).
012700 05 BRN03-DAYS-IN-YEAR PIC S9(04) BINARY.
012800 05 BRN03-LEAP-YEAR PIC S9(04) BINARY.
012900*
013000 01 WEL01-WELBURN-NBR-DAYS-CONTROL.
013100 05 WEL01-FIRST-DATE.
013200 10 WEL01-FD-CCYY PIC 9(04).
013300 10 WEL01-FD-MM PIC 9(02).
013400 10 WEL01-FD-DD PIC 9(02).
013500 05 WEL01-LAST-DATE.
013600 10 WEL01-LD-CCYY PIC 9(04).
013700 10 WEL01-LD-MM PIC 9(02).
013800 10 WEL01-LD-DD PIC 9(02).
013900 05 WEL01-NBR-DAYS PIC S9(06).
014000 05 WEL01-FIRST-YRNDAY.
014100 10 WEL01-FIRST-CCYY PIC 9(04).
014200 10 WEL01-FIRST-DDD PIC 9(03).
014300 05 WEL01-LAST-YRNDAY.
014400 10 WEL01-LAST-CCYY PIC 9(04).
014500 10 WEL01-LAST-DDD PIC 9(03).
014600 05 WEL01-YEAR-SPAN PIC S9(04).
014700 05 WEL01-YEARS-LEFT PIC S9(01).
014800 05 WEL01-QUOTENT PIC S9(04).
014900 05 WEL01-REMAINDER PIC S9(04).
015000*
015100 01 WEL02-WELBURN-JULIAN-DATE-CNTL.
015200 05 WEL02-GREG-DATE.
015300 10 WEL02-GREG-CCYY PIC 9(04).
015400 10 WEL02-GREG-MM PIC 9(02).
015500 10 WEL02-GREG-DD PIC 9(02).
015600 05 WEL02-JULI-DATE.
015700 10 WEL02-JULI-CCYY PIC 9(04).
015800 10 WEL02-JULI-DDD PIC 9(03).
015900 05 WEL02-QUOTENT PIC 9(04).
016000 05 WEL02-REMAINDER PIC 9(04).
016100 05 WEL02-LEAP-YEAR-SWITCH PIC X(01) VALUE 'N'.
016200 88 WEL02-LEAP-YEAR VALUE 'Y'.
016300 05 WEL02-MONTH-DATA.
016400 10 FILLER PIC X(14) VALUE 'JANUARY 01000'.
016500 10 FILLER PIC X(14) VALUE 'FEBURARY 02031'.
016600 10 FILLER PIC X(14) VALUE 'MARCH 03059'.
016700 10 FILLER PIC X(14) VALUE 'APRIL 04090'.
016800 10 FILLER PIC X(14) VALUE 'MAY 05120'.
016900 10 FILLER PIC X(14) VALUE 'JUNE 06151'.
017000 10 FILLER PIC X(14) VALUE 'JULY 07181'.
017100 10 FILLER PIC X(14) VALUE 'AUGUST 08212'.
017200 10 FILLER PIC X(14) VALUE 'SEPTEMBER09243'.
017300 10 FILLER PIC X(14) VALUE 'OCTOBER 10273'.
017400 10 FILLER PIC X(14) VALUE 'NOVEMBER 11304'.
017500 10 FILLER PIC X(14) VALUE 'DECEMBER 12334'.
017600 05 FILLER REDEFINES WEL02-MONTH-DATA.
017700 10 WEL02-MONTH-ENTRY OCCURS 12 TIMES.
017800 15 WEL02-MONTH-NAME PIC X(09).
017900 15 WEL02-MONTH-NBR PIC 9(02).
018000 15 WEL02-DAYS-BEFORE PIC 9(03).
018100*
018200 01 WEL03-WELBURN-DAY-OF-WEEK-CNTL.
018300 05 WEL03-DATE.
018400 10 WEL03-DATE-CC PIC 9(02).
018500 10 WEL03-DATE-YY PIC 9(02).
018600 10 WEL03-DATE-DDD PIC 9(03).
018700 05 WEL03-DAY-WORK PIC 9(04).
018800 05 WEL03-DAY-VALUE PIC 9(01).
018900 05 WEL03-QUOTENT PIC 9(04).
019000 05 WEL03-CC-COEFFICIENT-DATA.
019100 10 FILLER PIC X(03) VALUE '000'.
019200 10 FILLER PIC X(03) VALUE '011'.
019300 10 FILLER PIC X(03) VALUE '022'.
019400 10 FILLER PIC X(03) VALUE '033'.
019500 10 FILLER PIC X(03) VALUE '044'.
019600 10 FILLER PIC X(03) VALUE '055'.
019700 10 FILLER PIC X(03) VALUE '066'.
019800 10 FILLER PIC X(03) VALUE '077'.
019900 10 FILLER PIC X(03) VALUE '088'.
020000 10 FILLER PIC X(03) VALUE '099'.
020100 10 FILLER PIC X(03) VALUE '108'.
020200 10 FILLER PIC X(03) VALUE '117'.
020300 10 FILLER PIC X(03) VALUE '126'.
020400 10 FILLER PIC X(03) VALUE '135'.
020500 10 FILLER PIC X(03) VALUE '144'.
020600 10 FILLER PIC X(03) VALUE '153'.
020700 10 FILLER PIC X(03) VALUE '166'.
020800 10 FILLER PIC X(03) VALUE '174'.
020900 10 FILLER PIC X(03) VALUE '182'.
021000 10 FILLER PIC X(03) VALUE '190'.
021100 10 FILLER PIC X(03) VALUE '206'.
021200 10 FILLER PIC X(03) VALUE '214'.
021300 10 FILLER PIC X(03) VALUE '222'.
021400 10 FILLER PIC X(03) VALUE '230'.
021500 05 FILLER REDEFINES WEL03-CC-COEFFICIENT-DATA.
021600 10 WEL03-CC-COEFFICIENT-ENTRY OCCURS 24 TIMES.
021700 15 WEL03-CC PIC X(02).
021800 15 WEL03-CC-COEFFICIENT PIC 9(01).
021900 05 WEL03-DAY-CODE-DATA.
022000 10 FILLER PIC X(10) VALUE '0SATURDAY '.
022100 10 FILLER PIC X(10) VALUE '1SUNDAY '.
022200 10 FILLER PIC X(10) VALUE '2MONDAY '.
022300 10 FILLER PIC X(10) VALUE '3TUESDAY '.
022400 10 FILLER PIC X(10) VALUE '4WEDNESDAY'.
022500 10 FILLER PIC X(10) VALUE '5THURSDAY '.
022600 10 FILLER PIC X(10) VALUE '6FRIDAY '.
022700 05 FILLER REDEFINES WEL03-DAY-CODE-DATA.
022800 10 WEL03-DAY-CODE-ENTRY OCCURS 7 TIMES.
022900 15 WEL03-DAY-CODE-N PIC 9(01).
023000 15 WEL03-DAY-NAME PIC X(09).
023100*
023200 PROCEDURE DIVISION.
023300*
023400 000-START-OF-PROGRAM.
023600 DISPLAY ' '
023700 MOVE FUNCTION CURRENT-DATE TO SYST-CURR-DATE
023800 DISPLAY 'TODAY''S DATE: ' SYST-CURR-DATE-N
023900****
024000 ACCEPT SYST-JULI-DATE FROM DAY
024100 DISPLAY 'TODAY''S JULIAN DATE: ' SYST-JULI-DATE
024200****
024300 MOVE SYST-CURR-DATE-N TO INTR-GREG-DATE
024400 PERFORM 200-CAL-INTRINSIC-JULIAN-DATE
024500 DISPLAY ' FROM INTRINSIC FUNCTIONS: ' INTR-JULI-DATE
024600****
024700 MOVE SYST-CURR-DATE-A TO WEL02-GREG-DATE
024800 PERFORM 220-CAL-WELBURN-JULIAN-DATE
024900 DISPLAY ' FROM WELBURN ROUTINE: ' WEL02-JULI-DATE
025000****
025100 MOVE SYST-CURR-DATE-A TO BRN02-CURRENT-DATE
025200 PERFORM 250-CAL-BROWN-JULIAN-DATE
025300 DISPLAY ' FROM BROWN ROUTINE: ' BRN02-YRNDAY-DATE
025400****
025500 DISPLAY ' '
025600 DISPLAY 'SAMPLE FIRST DATE: ' WS-FIRST-DATE
025700 DISPLAY 'NBR DAYS BETWEEN CURR AND FIRST DATES INCL'
025800****
025900 MOVE SYST-CURR-DATE-N TO INTR-GREG-DATE
026000 MOVE WS-FIRST-DATE TO INTR-FIRST-DATE
026100 PERFORM 230-CAL-INTRINSIC-NBR-DAYS
026200 DISPLAY ' VIA INTRINSIC: ' INTR-NBR-DAYS
026300****
026400 MOVE SYST-CURR-DATE-A TO WEL01-LAST-DATE
026500 MOVE WS-FIRST-DATE-A TO WEL01-FIRST-DATE
026600 PERFORM 210-CAL-WELBURN-NBR-DAYS
026700 MOVE WEL01-NBR-DAYS TO WS-NBR-DAYS
026800 DISPLAY ' VIA WELBURN ROUTINE: ' WS-NBR-DAYS
026900****
027000 MOVE SYST-CURR-DATE-A TO BRN01-LAST-DATE
027100 MOVE WS-FIRST-DATE-A TO BRN01-FIRST-DATE
027200 PERFORM 240-CAL-BROWN-NBR-DAYS
027300 MOVE BRN01-NBR-DAYS TO WS-NBR-DAYS
027400 DISPLAY ' VIA BROWN ROUTINE: ' WS-NBR-DAYS
027500****
027600 DISPLAY ' '
027700 ACCEPT SYST-DAY FROM DAY-OF-WEEK
027800 DISPLAY 'COMPUTER DAY OF WEEK: '
027900 SYST-DAY-ENTRY (SYST-DAY )
028000****
028100 MOVE INTR-JULI-DATE TO WEL03-DATE
028200 PERFORM 270-CAL-WELBURN-DAY-OF-WEEK
028300 DISPLAY 'WELBURN DAY OF WEEK: '
028400 WEL03-DAY-NAME (WEL03-DAY-VALUE + 1 )
028500 STOP RUN
028600 .
028700*
028800 200-CAL-INTRINSIC-JULIAN-DATE.
029000 COMPUTE INTR-JULI-DATE
029100 = FUNCTION DAY-OF-INTEGER
029200 (FUNCTION INTEGER-OF-DATE (INTR-GREG-DATE ) )
029300 .
029400*
029500 210-CAL-WELBURN-NBR-DAYS.
029700 MOVE ZEROS TO WEL01-YEAR-SPAN
029800 MOVE ZEROS TO WEL01-NBR-DAYS
029900 MOVE ZEROS TO WEL01-QUOTENT
030000 MOVE ZEROS TO WEL01-REMAINDER
030100*
030200 MOVE WEL01-FIRST-DATE TO WEL02-GREG-DATE
030300 PERFORM 220-CAL-WELBURN-JULIAN-DATE
030400 MOVE WEL02-JULI-DATE TO WEL01-FIRST-YRNDAY
030500*
030600 MOVE WEL01-LAST-DATE TO WEL02-GREG-DATE
030700 PERFORM 220-CAL-WELBURN-JULIAN-DATE
030800 MOVE WEL02-JULI-DATE TO WEL01-LAST-YRNDAY
030900*
031000 SUBTRACT WEL01-FIRST-CCYY
031100 FROM WEL01-LAST-CCYY
031200 GIVING WEL01-YEAR-SPAN
031300 COMPUTE WEL01-NBR-DAYS
031400 = WEL01-LAST-DDD - WEL01-FIRST-DDD + 1
031500 IF WEL01-YEAR-SPAN IS NOT EQUAL TO ZEROS
031600 THEN
031700 COMPUTE WEL01-NBR-DAYS
031800 = WEL01-NBR-DAYS + (WEL01-YEAR-SPAN * 365 )
031900 DIVIDE WEL01-YEAR-SPAN BY 4
032000 GIVING WEL01-QUOTENT
032100 REMAINDER WEL01-REMAINDER
032200 ADD WEL01-QUOTENT TO WEL01-NBR-DAYS
032300 MOVE WEL01-REMAINDER TO WEL01-YEARS-LEFT
032400 DIVIDE WEL01-FIRST-CCYY BY 4
032500 GIVING WEL01-QUOTENT
032600 REMAINDER WEL01-REMAINDER
032700 SUBTRACT WEL01-REMAINDER FROM WEL01-YEARS-LEFT
032800 IF WEL01-YEARS-LEFT IS GREATER THAN ZEROS
032900 THEN
033000 ADD 1 TO WEL01-NBR-DAYS
033100 END-IF
033200 END-IF
033300 .
033400*
033500 220-CAL-WELBURN-JULIAN-DATE.
033700 MOVE ZEROS TO WEL02-QUOTENT
033800 MOVE ZEROS TO WEL02-REMAINDER
033900 MOVE WEL02-GREG-CCYY TO WEL02-JULI-CCYY
034000 MOVE WEL02-DAYS-BEFORE (WEL02-GREG-MM ) TO WEL02-JULI-DDD
034100 ADD WEL02-GREG-DD TO WEL02-JULI-DDD
034200 DIVIDE WEL02-JULI-CCYY BY 4
034300 GIVING WEL02-QUOTENT
034400 REMAINDER WEL02-REMAINDER
034500 IF WEL02-REMAINDER IS EQUAL TO ZEROS
034600 THEN
034700 SET WEL02-LEAP-YEAR TO TRUE
034800 ELSE
034900 MOVE 'N' TO WEL02-LEAP-YEAR-SWITCH
035000 END-IF
035100 DIVIDE WEL02-JULI-CCYY BY 400
035200 GIVING WEL02-QUOTENT
035300 REMAINDER WEL02-REMAINDER
035400 IF WEL02-LEAP-YEAR
035500 AND WEL02-JULI-CCYY (3:2 ) IS EQUAL TO ZEROS
035600 AND WEL02-REMAINDER IS NOT EQUAL TO ZEROS
035700 THEN
035800 MOVE 'N' TO WEL02-LEAP-YEAR-SWITCH
035900 END-IF
036000 IF WEL02-LEAP-YEAR
036010 AND WEL02-GREG-MM IS GREATER THAN 02
036100 THEN
036200 ADD 1 TO WEL02-JULI-DDD
036300 END-IF
036400 .
036500*
036600 230-CAL-INTRINSIC-NBR-DAYS.
036800 COMPUTE INTR-LAST-DATE
036900 = FUNCTION INTEGER-OF-DATE (INTR-GREG-DATE )
037000 COMPUTE INTRS-FIRST-DATE
037100 = FUNCTION INTEGER-OF-DATE (INTR-FIRST-DATE )
037200 COMPUTE INTR-NBR-DAYS
037300 = INTR-LAST-DATE - INTRS-FIRST-DATE + 1
037400 .
037500*
037600 240-CAL-BROWN-NBR-DAYS.
037800 MOVE ZEROS TO BRN01-NBR-DAYS
037900 MOVE BRN01-FIRST-DATE TO BRN02-CURRENT-DATE
038000 PERFORM 250-CAL-BROWN-JULIAN-DATE
038100 MOVE BRN02-YRNDAY-CCYY TO BRN01-FIRST-CCYY
038200 MOVE BRN02-YRNDAY-DDD TO BRN01-FIRST-DDD
038300*
038400 MOVE BRN01-LAST-DATE TO BRN02-CURRENT-DATE
038500 PERFORM 250-CAL-BROWN-JULIAN-DATE
038600 MOVE BRN02-YRNDAY-CCYY TO BRN01-LAST-CCYY
038700 MOVE BRN02-YRNDAY-DDD TO BRN01-LAST-DDD
038800*
038900 IF BRN01-LAST-CCYY IS EQUAL TO BRN01-FIRST-CCYY
039000 THEN
039100 COMPUTE BRN01-NBR-DAYS
039200 = BRN01-LAST-DDD - BRN01-FIRST-DDD
039300 ELSE
039400 MOVE BRN01-FIRST-CCYY TO BRN01-HOLD-CCYY
039500 PERFORM UNTIL BRN01-HOLD-CCYY = BRN01-LAST-CCYY
039600 MOVE BRN01-HOLD-CCYY TO BRN03-THE-YEAR
039700 PERFORM 260-CAL-BROWN-LEAP-YEAR
039800 MOVE BRN03-DAYS-IN-YEAR TO BRN01-DAYS-IN-YEAR
039900 MOVE BRN03-LEAP-YEAR TO BRN01-LEAP-YEAR
040000 IF BRN01-HOLD-CCYY IS EQUAL TO BRN01-FIRST-CCYY
040100 THEN
040200 COMPUTE BRN01-NBR-DAYS
040300 = BRN01-DAYS-IN-YEAR + 1 - BRN01-FIRST-DDD
040400 ELSE
040500 COMPUTE BRN01-NBR-DAYS
040600 = BRN01-NBR-DAYS + BRN01-DAYS-IN-YEAR
040700 END-IF
040800 ADD 1 TO BRN01-HOLD-CCYY
040900 END-PERFORM
041000 ADD BRN01-LAST-DDD TO BRN01-NBR-DAYS
041100 END-IF
041200 .
041300*
041400 250-CAL-BROWN-JULIAN-DATE.
041600 MOVE ZEROS TO BRN02-YRNDAY-CCYY
041700 MOVE ZEROS TO BRN02-YRNDAY-DDD
041800 MOVE BRN02-CD-CCYY TO BRN03-THE-YEAR
041900 PERFORM 260-CAL-BROWN-LEAP-YEAR
042000 MOVE BRN03-DAYS-IN-YEAR TO BRN02-DAYS-IN-YEAR
042100 MOVE BRN03-LEAP-YEAR TO BRN02-LEAP-YEAR
042200 IF BRN02-LEAP-YEAR IS EQUAL TO ZEROS
042300 THEN
042400 MOVE 29 TO BRN02-MONTH-DAYS (02 )
042500 ELSE
042600 MOVE 28 TO BRN02-MONTH-DAYS (02 )
042700 END-IF
042800 MOVE ZEROS TO BRN02-YRNDAY-DDD
042900 PERFORM VARYING BRN02-MX FROM 1 BY 1
043000 UNTIL BRN02-MX IS EQUAL TO BRN02-CD-MM
043100 ADD BRN02-MONTH-DAYS (BRN02-MX ) TO BRN02-YRNDAY-DDD
043200 END-PERFORM
043300 ADD BRN02-CD-DD TO BRN02-YRNDAY-DDD
043400 MOVE BRN02-CD-CCYY TO BRN02-YRNDAY-CCYY
043500 .
043600*
043700 260-CAL-BROWN-LEAP-YEAR.
043900 MOVE ZEROS TO BRN03-DAYS-IN-YEAR
044000 MOVE ZEROS TO BRN03-LEAP-YEAR
044100 MOVE ZEROS TO BRN03-TEMP-NUM
044200 DIVIDE BRN03-THE-YEAR BY 4 GIVING BRN03-TEMP-NUM
044300 REMAINDER BRN03-LEAP-YEAR
044400 IF BRN03-LEAP-YEAR IS EQUAL TO ZEROS
044500 THEN
044600 MOVE 366 TO BRN03-DAYS-IN-YEAR
044700 ELSE
044800 MOVE 365 TO BRN03-DAYS-IN-YEAR
044900 END-IF
045000 .
045100*
045200 270-CAL-WELBURN-DAY-OF-WEEK.
045400 MOVE ZEROS TO WEL03-DAY-WORK
045500 MOVE ZEROS TO WEL03-DAY-VALUE
045600 MOVE WEL03-CC-COEFFICIENT (WEL03-DATE-CC + 1 )
045700 TO WEL03-DAY-WORK
045800 ADD WEL03-DATE-YY TO WEL03-DAY-WORK
045900 COMPUTE WEL03-DAY-WORK
046000 = WEL03-DAY-WORK + WEL03-DATE-YY / 4
046100 ADD WEL03-DATE-DDD TO WEL03-DAY-WORK
046200 DIVIDE WEL03-DAY-WORK BY 7
046300 GIVING WEL03-QUOTENT
046400 REMAINDER WEL03-DAY-VALUE
046500 .
046600*
046700* END OF PROGRAM
Boyce G. Williams, Jr.
.---------------------------------------------------------------------.
| "People should have two virtues: purpose- the courage to envisage |
| and pursue valued goals uninhibited by the defeat of infantile |
| fantasies, by guilt and the failing fear punishment; and wisdom- a |
| detached concern with life itself, in the face of death itself." |
| Norman F. Dixon |
'---------------------------------------------------------------------'
Actually, this only works if the days are within the same year.
Otherwise you again have large gaps in your numbering system.
Using Epoch Time (with a reasonable choice of base date) like SAS does
lets you do the computation as Joe describes. A simple table lookup can
convert Epoch Time to Julian, Gregorian, or whatever display format you
need. I have COBOL routines to convert both ways which use 360K of
memory and handle dates from 1976 through 2003. Covering a longer
period just requires more memory, most of which is not even loaded when
running on IBM with VS COBOL II or COBOL for MVS and VM.
Kent
p.s. Epoch dates are the number of days from a specific point (for some
reason, we use 01/01/1996). Epoch times are number of tics (usually 1
second) from the same point. A 4-byte binary integer date (PIC S9(009)
BINARY) can contain any conceviable date range for business purposes
(almost 6 million years in either direction from the base date).
kdb
--
Kent Bloom Software Engineering
Software Performance Engineer is still an oxymoron --
Technical Services more art than science,
MCI Telecommunications more experiment than engineering
My opinions are my own -- who else would want them?
In COBOL-85 with the Intrinsic Function Addendum you write
COMPUTE DaysInBeetween = FUNCTION INTEGER-OF-DATE (LastDay) -
FUNCTION INTEGER-OF-DATE (FirstDay)
With FirstDay and LastDay of the form YYYYMMDD (i.e. PIC 9(8)).
Willy
--
------------------------------------------------------------------------------
Willy Weisz
Technische Universitaet Wien Vienna University of Technology
EDV-Zentrum Computing Services
Hochleistungsrechnen High Performance Computing
Wiedner Hauptstrasse 8-10
A-1040 Wien
Tel: (+43 1) 588 01 - 5818 Fax: (+43 1) 587 42 11
e-mail: we...@edvz.tuwien.ac.at
> Bill,
> The simplest method is to convert both dates to julian dates (you can
> find a routine in many books) and subtract giving the number of days.
>
> Joe.
This only works if the two dates are in the same year. If you are on an
IBM mainframe, with COBOL/370, there are built-in LE/370 routines to help
here. Convert both dates to the "Lilian" format, then subtract to give the
number of days. If you want the number of days included in the range, add
1 to the calculated difference.
Jerry
--
Jerry Wilcox == Jerry....@ucop.edu
I don't speak for the University and it doesn't speak for me.
I don't know what compiler you're using, but in Micro Focus the easiest
solution is to use the intrinsic function INTEGER-OF-DATE on each date,
then subtract them. I believe this function is part of the ANSI85
standard, but hopefully someone will correct me if I'm wrong.
--
David Furin |
| email: dandl...@worldnet.att.net
Information Systems Manager | smail: 2600 St. Clair Ave. NE
LaRich Distributors, Inc. | Cleveland, OH 44114 USA
> need. I have COBOL routines to convert both ways which use 360K of
> memory and handle dates from 1976 through 2003. Covering a longer
360K ? You don't actually need to have code to handle each day
separtely. Perhaps you meant 360 Bytes. ;-)
1099-EXIT.
EXIT.
This works without converting to Julian.
The dates are in the form:
02 SR057-YYYYMMDD-1 PIC 9(8).
02 FILLER REDEFINES SR057-YYYYMMDD.
03 SR057-YYYY-1 PIC 9(4).
03 SR057-MM-1 PIC 9(2).
03 SR057-DD-1 PIC 9(2).
02 SR057-YYYYMMDD-2 (same format as SR057-YYYYMMDD-1)
02 SR057-DDDDD PIC S9(5).
(# of days between the two dates).
>Joe Kohler wrote:
>>
>> Bill Wood wrote:
>> >
>> > Does anyone have an algorithm for calculating the number of days
between
>> > two given dates? I've written one, but I'm wondering if there is
something
>> > out there that is a little "cleaner". Thanks in advance.
>> >
>> > bill
>>
>> Bill,