在MongoDB中,您可以使用getTimestamp()函数从ObjectId中检索日期。如何使用Postgresql从MongoDB ObjectId中检索日期(例如,在这样的ObjectId存储在Postgres数据库中的情况下)?
示例输入:
507c7f79bcf86cd7994f6c0e 通缉输出:
2012-10-15T21:26:17Z
答案 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');