В 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
, что является точкой поворота между «BC» и «AD» эр. Возьмите первый момент года 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 года н.э.)