Oracle SQL中"YYYY"和"RRRR"之间有什么区别

Nit*_*ish 15 sql oracle

我在SQL中有2个查询:

select trunc(to_date('27-Jul-1987'),'YYYY') FROM dual; 
Run Code Online (Sandbox Code Playgroud)

select trunc(to_date('27-Jul-1987'),'RRRR') FROM dual; 
Run Code Online (Sandbox Code Playgroud)

两者都给了我相同的结果.'RRRR'和'YYYY'有什么区别?

Boh*_*ian 29

YYYY 将当前年份指定为4位数.

RRRR格式是指2位数年的范围内00,以49被认为是在当前世纪(即具有相同的前两个数字作为当前年),并给出年50通过99被认为是在前面的世纪.


Pra*_*hah 7

如果在要转换的日期中未指定年份的前2位数字:

  • YYYY将始终返回当前年份.
  • RRRR根据数据库中当前指定的年份返回年份.

试试这个示例代码:

SELECT TO_DATE ('010199', 'MMDDYYYY') AS date_a,
       TO_DATE ('010199', 'MMDDYY') AS date_b,
       TO_DATE ('010199', 'MMDDRR') AS date_c,
       TO_DATE ('010199', 'MMDDRRRR') AS date_d
  FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

2014年12月1日运行时的结果:

 DATE_A       DATE_B       DATE_C        DATE_D   
 ---------    ---------    ---------     ---------  
 1/1/0099      1/1/2099     1/1/1999      1/1/1999
Run Code Online (Sandbox Code Playgroud)

这个oracle 链接提供了很好的描述和示例.

从以上链接:

  • 如果指定的两位数年份是00到49,那么
    • 如果当前年份的最后两位数字是00到49,那么返回的年份与当前年份的前两位数字相同.
    • 如果当前年份的最后两位数字是50到99,那么返回年份的前2位数字比当前年份的前2位数字大1.
  • 如果指定的两位数年份是50到99,那么
    • 如果当前年份的最后两位数字是00到49,那么返回年份的前2位数字比当前年份的前2位数字少1.
    • 如果当前年份的最后两位数字是50到99,那么返回的年份与当前年份的前两位数字相同.


gfy*_*ytd 5

这个:

SQL> select  to_char(to_date('72-01-01','rrrr-mm-dd'),'yyyy') from dual;
Run Code Online (Sandbox Code Playgroud)

会给你:

1972年

但是这个:

SQL> select  to_char(to_date('72-01-01','yyyy-mm-dd'),'yyyy') from dual;
Run Code Online (Sandbox Code Playgroud)

会给你:

0072
Run Code Online (Sandbox Code Playgroud)