У Postgres 9.5 я здивований, побачивши результат, показаний нижче, експериментуючи з роком 0001
(немає нуля року 0000
).
Зсув -07:52:58
?
Деякі приклади коду. Зауважте, що я змішав використання, 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")
Я здивований тим , що друге значення: 0001-12-31 16:07:02-07:52:58 BC
. Я розумію, що ми повинні їхати назад на вісім годин, як America/Los_Angeles
на вісім годин за UTC за зміщенням -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
, що є точкою зрізу між епохами "до н.е." та "н. Е." Візьміть перший момент року 0001, відніміть годину, і ви отримаєте рік 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 року, але ви не можете констатувати "роки починають 1, а не 0" так, ніби це якийсь універсальний факт. Перекласти між ними просто, наприклад, для астрономічних даних. (Третє тисячоліття все-таки розпочалося так чи інакше в 2001 році, оскільки воно залишилося третім тисячоліттям після 1 року нашої ери)