手动将时间戳的PostgreSQL二进制格式转换为整数
Manually convert PostgreSQL binary format of timestamp to integer
我读到 PostgreSQL 在内部将时间戳存储为 8-byte/64-bit 整数。
为了检查这一点,我创建了一个 table,插入了一些时间戳并查询了 heap_page_items
。
输出例如因为时间戳 2019-01-08 09:00:00
是 00 e4 c2 56 ed 21 02 00
.
给定这个十六进制序列,我如何手动计算自 PostgreSQL 纪元 (2000-01-01) 以来的微秒数?使用时间戳转换器,我得到了值 600253200000
作为结果。我如何必须 "unpack" 个字节才能接收此值?
你的分析几乎是完美的,你肯定是在小端机器上。
您不必解压缩该值,因为在您的 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 微秒。
你在table中看到的整数是0x000221ed56c2e400,对应十进制600253200000000:
bash> printf "%ld\n" 0x000221ed56c2e400
600253200000000
我读到 PostgreSQL 在内部将时间戳存储为 8-byte/64-bit 整数。
为了检查这一点,我创建了一个 table,插入了一些时间戳并查询了 heap_page_items
。
输出例如因为时间戳 2019-01-08 09:00:00
是 00 e4 c2 56 ed 21 02 00
.
给定这个十六进制序列,我如何手动计算自 PostgreSQL 纪元 (2000-01-01) 以来的微秒数?使用时间戳转换器,我得到了值 600253200000
作为结果。我如何必须 "unpack" 个字节才能接收此值?
你的分析几乎是完美的,你肯定是在小端机器上。
您不必解压缩该值,因为在您的 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 微秒。
你在table中看到的整数是0x000221ed56c2e400,对应十进制600253200000000:
bash> printf "%ld\n" 0x000221ed56c2e400
600253200000000