【问题标题】:Manually convert PostgreSQL binary format of timestamp to integer手动将 PostgreSQL 二进制格式的时间戳转换为整数
【发布时间】:2019-02-13 19:38:09
【问题描述】:

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

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

给定这个十六进制序列,我如何手动计算自 PostgreSQL 纪元 (2000-01-01) 以来的微秒数?使用时间戳转换器,我得到了值 600253200000 作为结果。我如何必须“解包”字节才能接收此值?

【问题讨论】:

  • 您为什么要这样做? extract(epoch from ...) 怎么了?
  • 我需要识别包含时间戳的大型索引(数百万个条目)的一系列原始页面以应用一些优化,例如预热 buffer_cache 等。除此之外,我对它的工作原理很感兴趣,因为我打算编写一些使用这种格式生成二进制文件的代码

标签: postgresql timestamp binary-data


【解决方案1】:

你的分析几乎是完美的,而且你一定是在一个 little-endian 机器上。

您不必解压该值,因为在您的 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

【讨论】:

  • 噢!那太简单了 :) 谢谢!
猜你喜欢
  • 2014-02-18
  • 2021-11-14
  • 1970-01-01
  • 2014-07-06
  • 2016-02-21
  • 2016-07-28
  • 2017-05-20
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多