【发布时间】:2014-04-22 16:25:08
【问题描述】:
在 MongoDB 中,您可以使用 getTimestamp() 函数从 ObjectId 中检索日期。如何使用 SQL 从 MongoDB ObjectId 中检索日期(例如,在这样的 ObjectId 存储在 MySQL 数据库中的情况下)?
示例输入:
507c7f79bcf86cd7994f6c0e
想要的输出:
2012-10-15T21:26:17Z
【问题讨论】:
在 MongoDB 中,您可以使用 getTimestamp() 函数从 ObjectId 中检索日期。如何使用 SQL 从 MongoDB ObjectId 中检索日期(例如,在这样的 ObjectId 存储在 MySQL 数据库中的情况下)?
示例输入:
507c7f79bcf86cd7994f6c0e
想要的输出:
2012-10-15T21:26:17Z
【问题讨论】:
这可以在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(...) 将时间戳整数转换为日期请注意,默认情况下显示的日期将基于您系统的时区设置。
【讨论】:
对于那些使用 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)
)
【讨论】:
以 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
改编自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;
【讨论】:
红移
select timestamp 'epoch' + cast (STRTOL(left(_id,8),16) as bigint) * interval '1 second' as my_timestamp
【讨论】: