Oracle在内部使用Julian days进行日期的算术,一个日期的Julian day是指01-JAN-4713 BC(包括)以来的天数。
由于没有0年,并且Oracle's DATE的验证拒绝0年,而Julian day允许0年。因此虽然31-DEC-0001 BC的下一天是01-JAN-0001 AD,而Oracle认为这之间有其他366天,因此会在那一年产生不存在的天数。
alter session set nls_date_format = 'DD-MON-YYYY BC';
ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN;
SQL> select to_date('01-JAN-0001 AD') - to_date('31-DEC-0001 BC') from dual;
TO_DATE('01-JAN-0001AD')-TO_DA
------------------------------
367
对于范围在Julian days之间并且Oracle不映射到0年的,可以使用其作为函数来转换数字到单词格式。
SQL> select to_char(to_date(9999999, 'J'), 'JSP') from dual;
select to_char(to_date(9999999, 'J'), 'JSP') from dual
ORA-01854: julian 日期必须介于 1 和 5373484 之间
SQL> select to_char(to_date(5373484, 'J'), 'JSP') from dual;
TO_CHAR(TO_DATE(5373484,'J'),'
--------------------------------------------------------------------------
FIVE MILLION THREE HUNDRED SEVENTY-THREE THOUSAND FOUR HUNDRED EIGHTY-FOUR
SQL> select to_char(to_date(123456, 'J'), 'JSP') from dual;
TO_CHAR(TO_DATE(123456,'J'),'J
--------------------------------------------------------
ONE HUNDRED TWENTY-THREE THOUSAND FOUR HUNDRED FIFTY-SIX
SQL> select to_char(to_date(1721058, 'J'), 'JSP') from dual;
select to_char(to_date(1721058, 'J'), 'JSP') from dual
ORA-01841: (完整) 年份值必须介于 -4713 和 +9999 之间, 且不为 0
Oracle虽然意识到了这个bug单是并没有考虑修复,因为其有些困难,相反在文档中指明Oracle's Julian从4712 BC开始。
阅读(657) | 评论(0) | 转发(0) |