我读到PostgreSQL内部将时间戳存储为8字节/ 64位整数。为了验证这一点,我创建了一个表,插入了一些时间戳并查询了heap_page_items。例如,对于时间戳2019-01-08 09:00:00的输出是00 e4 c2 56 ed 21 02 00。给定这个十六进制序列,我如何手动计算自PostgreSQL纪元(2000-01-01)以来的微秒数?使用时间戳转换器,我得到值600253200000作为结果。我需要如何“解压”字节才能接收此值?
你的分析几乎完美,而且你一定是在小端机器上。
你不需要拆开这个值,因为在你的64位架构中,8字节整数可以适应PostgreSQL的Datum
。
SELECT extract(epoch FROM TIMESTAMP '2019-01-08 09:00:00')
- extract(epoch FROM TIMESTAMP '2000-01-01 00:00:00');
?column?
-----------
600253200
(1 row)
600253200秒等于600253200000000微秒。
在表格中看到的整数是0x000221ed56c2e400,它对应着十进制的600253200000000:
bash> printf "%ld\n" 0x000221ed56c2e400
600253200000000
extract(epoch from ...)
有什么问题吗? - user330315