为什么 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 日历(我这样做不知道),这可能是对您观察到的差异的解释。
链接
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 日历(我这样做不知道),这可能是对您观察到的差异的解释。
链接