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

问题描述 投票:0回答:6
在 MongoDB 中,您可以使用

getTimestamp()

 函数从 ObjectId 检索日期。如何使用 SQL 从 MongoDB ObjectId 检索日期(例如,当此类 ObjectId 存储在 MySQL 数据库中时)?

输入示例:

507c7f79bcf86cd7994f6c0e

想要的输出:

2012-10-15T21:26:17Z
    
sql mongodb
6个回答
6
投票
这可以在 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(...)
     将时间戳整数转换为日期
请注意,默认情况下显示的日期将基于您系统的时区设置。


3
投票
对于使用 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) )
    

1
投票

红移

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

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

改编自

另一个问题的另一个答案

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;
    

0
投票
对于上面的答案,我想提供一个

BigQuery 的示例

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

0
投票
我怎样才能为 ingres actian 向量做到这一点

© www.soinside.com 2019 - 2024. All rights reserved.