W Postgres 9.5 byłem zaskoczony widząc wynik widoczny poniżej podczas eksperymentowania z rokiem 0001
(bez roku zero 0000
).
Przesunięcie -07:52:58
?
Niektóre przykładowy kod. Zauważ, że użyłem mieszanego TIMESTAMP WITH TIME ZONE
i TIMESTAMP WITHOUT TIME ZONE
, więc przeczytaj uważnie.
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")
Jestem zaskoczony tej drugiej wartości: 0001-12-31 16:07:02-07:52:58 BC
. Rozumiem, że musimy cofnąć się o osiem godzin wstecz, podobnie jak America/Los_Angeles
osiem godzin za UTC, z przesunięciem o -08:00
. Ale zamiast -08:00
przesunięcia jest -07:52:58
. Dlaczego?
Bez problemu pod UTC
Nie ma takiego problemu przy wprowadzaniu danych w 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")
Bez roku zerowego
Nawiasem mówiąc, część daty wydaje się być poprawna. Wydaje się, że nie ma roku 0000
, który byłby punktem zwrotnym między epokami „BC” i „AD”. Weź pierwszą chwilę roku 0001, odejmij godzinę, a dostaniesz rok 0001 BC
- więc nie ma roku zero.
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_ ;
Rezultatem jest rok 0001 BC
, więc przeskakujemy od 0001
do 0001 BC
; nie ma roku zero 0000
.
"0001-12-31 23:00:00+00 BC"
0000
jako prawidłowej wartości roku, ale nie nalega na to, czy jest ona używana, czy nie ). To prawda, że PostgreSQL używa formularza bez roku 0, ale nie można powiedzieć „lata zaczynają się od 1, a nie 0”, jakby to był jakiś uniwersalny fakt. Łatwo jest między nimi tłumaczyć np. Dane astronomiczne. (Trzecie tysiąclecie nadal zaczynało się w 2001 r. W obu kierunkach, ponieważ pozostało trzecie tysiąclecie od 1 roku n.e.)