手动将时间戳的PostgreSQL二进制格式转换为整数

时间:2019-02-13 19:38:09

标签: postgresql timestamp binary-data

我读到PostgreSQL在内部将时间戳存储为8字节/ 64位整数。

要进行检查,我创建了一个表,插入了一些时间戳并查询了heap_page_items
输出例如时间戳2019-01-08 09:00:0000 e4 c2 56 ed 21 02 00

鉴于此十六进制序列,如何手动计算自PostgreSQL时代(2000-01-01)起的微秒数?使用时间戳转换器,我得到了值600253200000作为结果。我该如何“拆包”字节以接收该值?

1 个答案:

答案 0 :(得分:1)

您的分析几乎是完美的,并且您必须使用小端机。

您不必解压缩该值,因为在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秒是6002532亿微秒。

您在表格中看到的整数是0x000221ed56c2e400,它对应于十进制600253200000000:

bash> printf "%ld\n" 0x000221ed56c2e400
600253200000000
相关问题