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 に答える