在计算Oracle(11.2.0.3.0)和Teradata(13.10.07.15)中两个日期之间的差异时遇到了一个奇怪的问题。 Oracle中的NLS_CALENDAR参数设置为GREGORIAN。
Oracle Teradata
------------------------------------------------------------------------------------------------------------
select trunc(sysdate) - date'1800-01-01' diff from dual; select date - date'1800-01-01' diff;
DIFF diff
---------- -----------
78224 78224
到目前为止没有区别。
select trunc(sysdate) - date'1500-01-01' diff from dual; select date - date'1500-01-01' diff;
DIFF diff
---------- -----------
187788 187797
9天的差异。
select trunc(sysdate) - date'1000-01-01' diff from dual; select date - date'1000-01-01' diff;
DIFF diff
---------- -----------
370413 370418
5天的差异。
select trunc(sysdate) - date'0500-01-01' diff from dual; select date - date'0500-01-01' diff;
DIFF diff
---------- -----------
553038 553039
1天的差异。
select trunc(sysdate) - date'0001-01-01' diff from dual; select date - date'0001-01-01' diff;
DIFF diff
---------- -----------
735297 735295
2天的差异。
有谁知道为什么会出现这种差异?
答案 0 :(得分:4)
很简单,Oracle错了: - )
select
date '1582-10-04'+1,
date '1582-10-05'+1,
date '1582-10-14'+1,
date '1582-10-15'+1
from dual;
| DATE'1582-10-04'+1 | DATE'1582-10-05'+1 | DATE'1582-10-14'+1 | DATE'1582-10-15'+1 |
|--------------------------------|--------------------------------|--------------------------------|--------------------------------|
| October, 15 1582 00:00:00+0000 | October, 16 1582 00:00:00+0000 | October, 25 1582 00:00:00+0000 | October, 16 1582 00:00:00+0000 |
对于日期差异,Teradata使用标准SQL日历实现,这是一个普通的格里高利历,而Oracle使用一个保证的Julian日历(即使NLS称之为GREGORIAN)。
参见Gulutzan / Pelzer撰写的论文:http://www.orafaq.com/papers/dates_o.doc