如何从postgres中的mongodb objectid中提取时间戳

时间:2017-08-31 21:41:58

标签: mongodb postgresql

在MongoDB中,您可以使用getTimestamp()函数从ObjectId中检索日期。如何使用Postgresql从MongoDB ObjectId中检索日期(例如,在这样的ObjectId存储在Postgres数据库中的情况下)?

示例输入:

507c7f79bcf86cd7994f6c0e 通缉输出:

2012-10-15T21:26:17Z

2 个答案:

答案 0 :(得分:2)

Mongodb documentation中,形成了Objectid,其时间戳为前4个字节,但这以十六进制表示。假设十六进制值在PostgreSQL中存储为字符串,则以下查询将仅提取该objectid的前8个字符,将其转换为整数(从1970-01-01开始的秒数),然后将该整数转换为时间戳。例如:

SELECT TO_TIMESTAMP(int_val) ts_val
FROM (
    SELECT ('x' || lpad(left(objectid,8), 8, '0'))::bit(32)::int AS int_val
    FROM   (
       VALUES ('507c7f79bcf86cd7994f6c0e') 
       ) AS t1(objectid)
    ) AS t2
;

这里讨论将十六进制字符串转换为整数: Convert hex in text representation to decimal number

答案 1 :(得分:0)

第一个答案是非常好的。通过使用可重用功能扩展了答案。

create function extractMongoTimestamp(text) RETURNS TIMESTAMP WITH TIME ZONE
as
'SELECT TO_TIMESTAMP(int_val) ts_val
FROM (
    SELECT (''x'' || lpad(left(objectid,8), 8, ''0''))::bit(32)::int AS int_val
    FROM   (
       VALUES ($1)
       ) AS t1(objectid)
    ) AS t2'
language sql
immutable
RETURNS null on null input;

在查询中使用它:

select extractMongoTimestamp('507c7f79bcf86cd7994f6c0e');