Postgres 9.5では、年0001
(ゼロ0000
年なし)を試しているときに以下の結果が表示されたことに驚きました。
のオフセット-07:52:58
?
いくつかのサンプルコード。Iの混合使用することを注意TIMESTAMP WITH TIME ZONE
してTIMESTAMP WITHOUT TIME ZONE
、慎重に読んでください。
SET TIME ZONE 'America/Los_Angeles' ;
SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',
TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z',
TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;
("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")
私はその2番目の値に驚いています0001-12-31 16:07:02-07:52:58 BC
。America/Los_Angeles
UTCから8時間遅れているのと同じように、オフセットを8時間戻し-08:00
ます。しかし-08:00
、オフセットの代わりにです-07:52:58
。どうして?
UTCで問題なし
UTCでデータを入力する場合、このような問題はありません。
SET TIME ZONE 'UTC' ;
SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',
TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z',
TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');
("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")
年ゼロなし
ちなみに、日付部分は正しいようです。0000
「BC」時代と「AD」時代の要点である年はないようです。年0001の最初の瞬間をとって1時間を差し引くと、年が得られます0001 BC
ので、年のゼロはありません。
SET TIME ZONE 'UTC' ;
INSERT INTO moment_ -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;
SET TIME ZONE 'UTC' ;
TABLE moment_ ;
結果は年な0001 BC
ので、からにジャンプ0001
し0001 BC
ます。年ゼロはありません0000
。
"0001-12-31 23:00:00+00 BC"
0000
、有効な年の値として両方をサポートしますが、使用するかどうかを主張しません) )。PostgreSQLが年0のない形式を使用しているのは事実ですが、「万年が0ではなく1から始まる」とは、その普遍的な事実のようなものではありません。たとえば天文データの場合、それらの間の変換は簡単です。(3番目の千年紀は、西暦1年以来3番目の千年紀のままであるため、どちらの方法でも2001年に開始されました)