Oracle和Teradata之间的日期差异

时间:2014-03-04 10:10:27

标签: sql oracle date calendar teradata

在计算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天的差异。

有谁知道为什么会出现这种差异?

1 个答案:

答案 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