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

4
我读到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作为结果。我需要如何“解压”字节才能接收此值?

为什么你想要这样做呢?extract(epoch from ...)有什么问题吗? - user330315
我需要识别一个包含时间戳的大型索引(数百万条目)的原始页面范围,以应用一些优化,如预热缓冲区等。除此之外,我对这个工作原理很感兴趣,因为我计划编写一些使用这种格式生成二进制文件的代码。 - user35934
1个回答

3

你的分析几乎完美,而且你一定是在小端机器上。

你不需要拆开这个值,因为在你的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

1
哎呀!这太简单了 :) 谢谢! - user35934

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接