1

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

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

4

1 回答 1

2

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

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

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

Instantjava.time 中的其他类使用预测的公历,因此给出 999 年和 1000 年的不准确日期。如果 Exasol 使用儒略历(我不知道),这可能是您观察到的差异的解释。

链接

于 2020-09-15T00:48:23.810 回答