为什么 exasol 转换旧时间戳错误?

Why exasol transform old timestamp wrong?

Exasol 错误地转换旧日期:

SELECT ADD_SECONDS('1970-01-01 00:00:00',-30610224000.000)
-- 0999-12-27 00:00:00

SELECT ADD_SECONDS('1970-01-01 00:00:00',-30609792000.000)
-- 1000-01-01 00:00:00

在 java 期间:

  System.out.println(Instant.ofEpochMilli(0).plus(-30610224000L, ChronoUnit.SECONDS));
  System.out.println(Instant.ofEpochMilli(0).plus(-30609792000L, ChronoUnit.SECONDS));

1000-01-01T00:00:00Z
1000-01-06T00:00:00Z

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

不知道 Exasol 我敢打赌这是儒略历和公历的区别。

儒略历(以凯撒大帝的名字命名)始终每 4 年有一次闰年。在历史的某个时刻,他们发现这给出了太多的闰年。因此,在教皇格雷戈尔的领导下,公历被引入,将闰年排除在能被 100 整除但不能被 400 整除的年份(因此 1900 年不是闰年,2000 年是,2100 年不是)。这种变化被称为公历变化 或转换。

公历 是一项较新的发明。它将公历推回到公历变更之前的时间,因此使用的日期与当时实际使用的日历不一致。优点是计算更简单,我们无需决定何时进行公历更改,这很好,因为每个司法管辖区都有自己的日期。

Instant 和 java.time 中的另一个 类 使用公历,所以给出 999 年和 1000 年的日期不准确。如果 Exasol 使用 Julian 日历(我这样做不知道),这可能是对您观察到的差异的解释。

链接