Assumed century window
When a program uses windowed date fields, the compiler
applies the century window that is defined by the YEARWINDOW
compiler
option to the compilation unit. When a windowed date field is used
in conjunction with a nondate, and the context demands that the nondate
be treated as a windowed date, the compiler uses an assumed century
window to resolve the nondate field.
The assumed century window is 1900-1999, which typically is not the same as the century window for the compilation unit.
In many cases, particularly for literal nondates, this assumed century window is the correct choice. In the following construct, the literal should retain its original meaning of January 1, 1972, and not change to 2072 if the century window is, for example, 1975-2074:
01 Manufacturing-Record.
03 Makers-Date Pic X(6) Date Format yyxxxx.
. . .
If Makers-Date Greater than "720101" . . .
Even if the assumption is correct, it is better to
make the year
explicit and eliminate the warning-level diagnostic message (which
results from applying the assumed century window) by using the DATEVAL
intrinsic
function:
If Makers-Date Greater than
Function Dateval("19720101" "YYYYXXXX") . . .
In some cases, the assumption might not be correct.
For the following
example, assume that Project-Controls
is in a copy
member that is used by other applications that have not yet been upgraded
for year 2000 processing, and therefore Date-Target
cannot
have a DATE FORMAT
clause:
01 Project-Controls.
03 Date-Target Pic 9(6).
. . .
01 Progress-Record.
03 Date-Complete Pic 9(6) Date Format yyxxxx.
. . .
If Date-Complete Less than Date-Target . . .
In the example above, the following three conditions
need to be
true to make Date-Complete
earlier than (less than) Date-Target
:
- The century window is 1910-2009.
Date-Complete
is 991202 (Gregorian date: December 2, 1999).Date-Target
is 000115 (Gregorian date: January 15, 2000).
However, because Date-Target
does
not have a DATE
FORMAT
clause, it is a nondate. Therefore, the century window
applied to it is the assumed century window of 1900-1999, and it is
processed as January 15, 1900. So Date-Complete
will
be greater than Date-Target
, which is not the required result.
In this case, you should
use the DATEVAL
intrinsic
function to convert Date-Target
to a date field for
this comparison. For example:
If Date-Complete Less than
Function Dateval (Date-Target "YYXXXX") . . .