No Postgres 9.5, fiquei surpreso ao ver o resultado visto abaixo ao experimentar o ano 0001
(sem ano zero 0000
).
Deslocamento de -07:52:58
?
Algum código de exemplo. Note que eu misturei o uso de TIMESTAMP WITH TIME ZONE
e TIMESTAMP WITHOUT TIME ZONE
, portanto, leia com atenção.
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")
Estou surpreso por esse segundo valor: 0001-12-31 16:07:02-07:52:58 BC
. Entendo que devemos retroceder oito horas, ou America/Los_Angeles
seja, oito horas atrás do UTC com um deslocamento de -08:00
. Mas em vez do -08:00
deslocamento é -07:52:58
. Por quê?
Nenhum problema no UTC
Não existe esse problema ao inserir dados no 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")
No Year Zero
A propósito, a parte da data parece estar correta. Parece que não há ano 0000
, sendo esse o ponto de articulação entre as épocas "BC" e "AD". Tome o primeiro momento do ano 0001, subtraia uma hora e você obtém o ano 0001 BC
- portanto, nenhum ano 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_ ;
O resultado é o ano 0001 BC
, então saltamos de 0001
para 0001 BC
; nenhum ano zero 0000
.
"0001-12-31 23:00:00+00 BC"
0000
um valor de ano válido, mas não a insistência em se deve ou não ser usado ) É verdade que o PostgreSQL usa o formulário sem o ano 0, mas você não pode declarar "os anos iniciam um 1, não 0" como se fosse algum tipo de fato universal. É fácil traduzir entre eles para, por exemplo, dados astronômicos. (O terceiro milênio ainda começou em 2001, de qualquer maneira, uma vez que permaneceu o terceiro milênio desde 1 EC)