RR 日期时间格式化元素类似于 YY 日期时间格式化元素,但它为跨世纪日期值存储提供了额外的灵活性。在 YY 日期时间格式化元素里,您需要指定年份的全部数字。而在 RR 日期时间格式化元素里,您只需指定年份数字的最后两位数,便可以存储日期值。

    RR 日期时间格式化元素与 TO_DATE 函数一起使用,返回值的世纪根据指定的两位数字年份和当前年份的最后两位数字而变化。如果 YY 日期时间格式化元素与 TO_DATE 函数一起使用,则返回的年份始终与当前年份具有相同的世纪。

    如果指定的两位数字年份是 00~49,当前年份的最后两位数字是 00~49,则返回的年份与当前年份具有相同的世纪。当前年份的后两位数字是 50~99,则返回年份的前两位数字为下一个世纪。

    如果指定的两位数字年份是 50~99,当前年份的后两位数字为 00 到 49,则返回年份的前两位数字为当前年份 的上一个世纪。当前年份的最后两位数字是 50~99,则返回的年份与当前年份处于同一个世纪。

    如下所示,RR 日期时间格式化元素根据前两位数字不同的年份返回相同的值。假设这些查询是在 1950~1999 年期间发出的,执行以下语句:

    1. SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year1" ,
    2. TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year2" FROM DUAL;

    查询结果如下:

    1. +-------+-------+
    2. | Year1 | Year2 |
    3. +-------+-------+
    4. | 1998 | 2017 |
    5. +-------+-------+

    假设这些查询是在 2000~2049 年期间发出的,执行以下语句:

    1. SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year1" ,
    2. TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year2" FROM DUAL;

    查询结果如下:

    1. +-------+-------+
    2. | Year1 | Year2 |
    3. +-------+-------+
    4. | 1998 | 2017 |
    5. +-------+-------+

    通过上面 2 个示例的查询结果可见,无论是在 2000 年之前还是之后查询,都将返回相同的值。