【问题标题】:How to retrieve the date from a MongoDB ObjectId using SQL如何使用 SQL 从 MongoDB ObjectId 中检索日期
【发布时间】:2014-04-22 16:25:08
【问题描述】:

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

示例输入:

507c7f79bcf86cd7994f6c0e

想要的输出:

2012-10-15T21:26:17Z

【问题讨论】:

    标签: sql mongodb


    【解决方案1】:

    这可以在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(...) 将时间戳整数转换为日期

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

    【讨论】:

    • @NeilLunn,与无关并不意味着其他人不会觉得它有用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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;
      

      【讨论】:

        【解决方案4】:

        红移

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

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 2021-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-23
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多