在MongoDB中,您可以使用getTimestamp()
函数从ObjectId中检索日期。如何使用SQL从MongoDB ObjectId中检索日期(例如,在这样的ObjectId存储在MySQL数据库中的情况下)?
示例输入:
507c7f79bcf86cd7994f6c0e
通缉输出:
2012-10-15T21:26:17Z
答案 0 :(得分:3)
这可以通过以下方式实现(假设objectId
是一个字符串):
SELECT FROM_UNIXTIME(CAST(CONV(SUBSTR(objectId, 1, 8), 16, 10) AS UNSIGNED)) FROM table
它的工作原理如下:
SUBSTR(objectId, 1, 8)
获取十六进制objectId
字符串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)
以 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;
答案 3 :(得分:0)
红移
select timestamp 'epoch' + cast (STRTOL(left(_id,8),16) as bigint) * interval '1 second' as my_timestamp