ใน 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 กับ offset -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 CE)