sql - Oracle 和 Teradata 之间的日期差异

标签 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 天。

有谁知道为什么会这样?

最佳答案

很简单,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

关于sql - Oracle 和 Teradata 之间的日期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168868/

相关文章:

SQL Server : IF EXISTS ; ELSE

sql - 旋转单行列 T-SQL

oracle日期算术返回意外大的数字

java - flyway 命令行工具 - 重新执行失败的 DDL 的选项是什么?

php - postgresql 类型错误

php - 将字符串转换为 UNIX 时间戳

javascript - 从日期中提取年份并计算日期差

当我使用 not in (column_name) 时,Mysql 返回空结果

SQL Grant on - 适用于多个用户

sql - 如何在 oracle sql 查询中生成行项目编号