如何使用SQL从MongoDB ObjectId中检索日期

时间:2014-03-17 12:53:05

标签: sql mongodb

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

示例输入:

507c7f79bcf86cd7994f6c0e

通缉输出:

2012-10-15T21:26:17Z

4 个答案:

答案 0 :(得分:3)

这可以通过以下方式实现(假设objectId是一个字符串):

SELECT FROM_UNIXTIME(CAST(CONV(SUBSTR(objectId, 1, 8), 16, 10) AS UNSIGNED)) FROM table

它的工作原理如下:

  • SUBSTR(objectId, 1, 8)获取十六进制objectId字符串
  • 中的前8个字符
  • CONV(..., 16, 10)将十六进制数转换为十进制数,并将其作为字符串返回(表示UNIX时间戳)
  • CAST (...) AS UNSIGNED将时间戳字符串转换为无符号整数
  • FROM_UNIXTIME(...)将时间戳整数转换为日期

请注意,默认情况下,显示的日期将取决于系统的时区设置。

答案 1 :(得分:1)

对于那些使用SQL Server的人来说,会产生类似的结果:

SELECT DATEADD(
    SECOND,
    CAST(
        CONVERT(
            BINARY(4), '0x'+SUBSTRING(@MongoObjectId, 1, 8), 1
        ) AS BIGINT
    ),
    CAST('1970-01-01 00:00' AS DATETIME)
)

答案 2 :(得分:0)

MSSQL

以 Teemu 的 answer 为基础

为了让一些更容易重用,你可以像这样把它包装成你自己的标量函数

CREATE FUNCTION dbo.mongoCreated(@_id CHAR(24))
    RETURNS DATETIME
AS
BEGIN
    RETURN DATEADD(
        SECOND,
        CAST(
            CONVERT(
                BINARY(4), '0x' + SUBSTRING(@_id, 1, 8), 1
            ) AS BIGINT
        ),
        CAST('1970-01-01 00:00' AS DATETIME)
    )
END

Postgres

改编自another answer to another question

CREATE FUNCTION mongo_timestamp(_id char(24))
    RETURNS TIMESTAMP
    LANGUAGE plpgsql
AS
$$
BEGIN
    RETURN TO_TIMESTAMP(('x' || lpad(LEFT(_id, 8), 8, '0'))::BIT(32)::INT);
END ;
$$
IMMUTABLE
RETURNS NULL ON NULL INPUT;

答案 3 :(得分:0)

红移

select timestamp 'epoch' + cast (STRTOL(left(_id,8),16) as bigint) * interval '1 second' as my_timestamp