我已经读过PostgreSQL在内部将时间戳存储为8字节/ 64位整数。
为了检查这个,我创建了一个表,插入了一些时间戳并查询了heap_page_items
。
输出例如时间戳2019-01-08 09:00:00
是00 e4 c2 56 ed 21 02 00
。
鉴于这个十六进制序列,如何手动计算自PostgreSQL epoch(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