In Postgres 9.5 war ich überrascht, das unten gezeigte Ergebnis zu sehen, während ich mit dem Jahr 0001
(ohne Jahr Null 0000
) experimentierte .
Offset von -07:52:58
?
Ein Beispielcode. Beachten Sie, dass ich gemischte Verwendung von TIMESTAMP WITH TIME ZONE
und TIMESTAMP WITHOUT TIME ZONE
, also lesen Sie sorgfältig.
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")
Ich bin von diesem zweiten Wert überrascht: 0001-12-31 16:07:02-07:52:58 BC
. Ich verstehe, dass wir acht Stunden zurückgehen müssen, da wir America/Los_Angeles
acht Stunden hinter UTC mit einem Offset von liegen -08:00
. Aber stattdessen ist -08:00
der Versatz -07:52:58
. Warum?
Kein Problem unter UTC
Kein solches Problem bei der Eingabe von Daten unter 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")
Kein Jahr Null
Übrigens scheint der Datumsanteil korrekt zu sein. Es scheint, als gäbe es kein Jahr 0000
, da es der Dreh- und Angelpunkt zwischen den Epochen „BC“ und „AD“ ist. Nehmen Sie den ersten Moment des Jahres 0001, subtrahieren Sie eine Stunde und Sie erhalten das Jahr 0001 BC
- also kein Jahr Null.
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_ ;
Das Ergebnis ist das Jahr 0001 BC
, also springen wir von 0001
zu 0001 BC
; kein Jahr Null 0000
.
"0001-12-31 23:00:00+00 BC"
0000
als gültigen Jahreswert, besteht jedoch nicht darauf, ob er verwendet wird oder nicht) ). Es ist wahr, dass PostgreSQL das Formular ohne Jahr 0 verwendet, aber Sie können nicht "Jahre beginnen eine 1, nicht 0" als eine Art universelle Tatsache angeben. Es ist einfach, zwischen ihnen zu übersetzen, z. B. für astronomische Daten. (Das dritte Jahrtausend begann immer noch in beiden Richtungen im Jahr 2001, da es das dritte Jahrtausend seit dem 1. Jahrhundert nach Christus war.)