En Postgres 9.5, me sorprendió ver el resultado que se ve a continuación al experimentar con el año 0001
(sin año cero 0000
).
Compensación de -07:52:58
?
Algún código de ejemplo. Tenga en cuenta que mezclé el uso de TIMESTAMP WITH TIME ZONE
y TIMESTAMP WITHOUT TIME ZONE
, así que lea detenidamente.
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")
Estoy sorprendido por que el segundo valor: 0001-12-31 16:07:02-07:52:58 BC
. Entiendo que debemos retroceder ocho horas al igual America/Los_Angeles
que ocho horas detrás de UTC con una compensación de -08:00
. Pero en lugar del -08:00
desplazamiento es -07:52:58
. ¿Por qué?
No hay problema bajo UTC
No existe tal problema al ingresar datos bajo 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
Por cierto, la parte de la fecha parece ser correcta. Parece que no hay año 0000
, ese es el punto de pivote entre las eras "BC" y "AD". Tome el primer momento del año 0001, reste una hora y obtendrá el año 0001 BC
, así que no hay año cero.
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_ ;
El resultado es el año 0001 BC
, entonces saltamos de 0001
a 0001 BC
; sin año cero 0000
.
"0001-12-31 23:00:00+00 BC"
0000
un valor de año válido pero no insistan en si se usa o no) ) Es cierto que PostgreSQL usa el formulario sin año 0, pero no puede indicar "años comienzan con 1, no con 0" como si fuera una especie de hecho universal. Es fácil traducir entre ellos, por ejemplo, datos astronómicos. (El tercer milenio aún comenzó en 2001 de cualquier manera, ya que siguió siendo el tercer milenio desde 1 CE)