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

w7t8yxp5  于 2023-04-11  发布在  Go
关注(0)|答案(5)|浏览(150)

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

507c7f79bcf86cd7994f6c0e

所需输出:

2012-10-15T21:26:17Z
qq24tv8q

qq24tv8q1#

这可以在MySQL中实现如下(假设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(...)将时间戳整数转换为日期

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

hgtggwj0

hgtggwj02#

对于使用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)
)
envsm3lx

envsm3lx3#

红移

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

rta7y2nd4#

MSSQL

在Teemu的answer上构建
为了使一些更容易重用,可以像这样将其 Package 到自己的标量函数中

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;
ljo96ir5

ljo96ir55#

对于上面的答案,我想提供一个关于BigQuery的示例

SELECT TIMESTAMP_MILLIS(
  CAST(CONCAT('0x', LEFT('6238e198653c381798d93493', 8)) AS INT64) * 1000
)

相关问题