getTimestamp()
函数从 ObjectId 检索日期。如何使用 SQL 从 MongoDB ObjectId 检索日期(例如,当此类 ObjectId 存储在 MySQL 数据库中时)?输入示例:
507c7f79bcf86cd7994f6c0e
想要的输出:
2012-10-15T21:26:17Z
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(...)
将时间戳整数转换为日期
SELECT DATEADD(
SECOND,
CAST(
CONVERT(
BINARY(4), '0x'+SUBSTRING(@MongoObjectId, 1, 8), 1
) AS BIGINT
),
CAST('1970-01-01 00:00' AS DATETIME)
)
红移
select timestamp 'epoch' + cast (STRTOL(left(_id,8),16) as bigint) * interval '1 second' as my_timestamp
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
PostgresCREATE 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;
BigQuery 的示例
SELECT TIMESTAMP_MILLIS(
CAST(CONCAT('0x', LEFT('6238e198653c381798d93493', 8)) AS INT64) * 1000
)