在Postgres 9.5中,我很惊讶地看到下面的年份在尝试年份0001
(没有年份0 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
。我知道我们必须向后退8 America/Los_Angeles
个小时,比UTC 落后8个小时,但要相差-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以来仍然是第三个千年)