【问题标题】:Difference in Date between Oracle and TeradataOracle 和 Teradata 之间的日期差异
【发布时间】:2014-04-05 19:20:35
【问题描述】:

我在计算 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 天。

有人知道为什么会有这种差异吗?

【问题讨论】:

    标签: sql oracle date calendar teradata


    【解决方案1】:

    很简单,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 使用一个预测儒略历(即使 NLS 将其称为 GREGORIAN)。

    参见 Gulutzan/Pelzer 的论文:http://www.orafaq.com/papers/dates_o.doc

    【讨论】:

    • 谢谢,但这并不能解释为什么两组查询之间的差异会随着日期的不同而大不相同。此外,在 11g 中运行时,上述查询给出了 10 月 4 日、5 日、14 日和 15 日。您是在哪个版本中运行的?
    • 11g R2。是的,这很奇怪,它以某种方式基于从儒略历到公历时省略的 11 天,但请向 Oracle 询问详细信息,他们为什么以及如何做到这一点 :-)
    • 我刚刚注意到,我为结果粘贴了错误的查询,它不包括+1。当然,当我重新阅读我的答案时,您会有些困惑。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2011-02-01
    • 2020-03-13
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多