In Postgres 9.5, I was surprised to see the result seen below while experimenting with year 0001
(no year zero 0000
).
Offset of -07:52:58
?
Some example code. Note that I mixed use of TIMESTAMP WITH TIME ZONE
and TIMESTAMP WITHOUT TIME ZONE
, so read carefully.
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")
I am surprised by that second value: 0001-12-31 16:07:02-07:52:58 BC
. I understand that we must go backwards eight hours as America/Los_Angeles
is eight hours behind UTC with an offset of -08:00
. But instead of -08:00
the offset is -07:52:58
. Why?
No Problem Under UTC
No such issue when entering data under 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
By the way, the date portion seems to be correct. It seems there is no year 0000
, that being the pivot point between the “BC” and “AD” eras. Take the first moment of year 0001, subtract an hour, and you get the year 0001 BC
– so no year 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_ ;
The result is the year 0001 BC
, so we jump from 0001
to 0001 BC
; no year zero 0000
.
"0001-12-31 23:00:00+00 BC"