UUID v7 定义为:
前 48 位是自 Unix 纪元以来的大端无符号毫秒数。接下来的 4 位是版本位 (0111),后面是 12 位伪随机数据。
如何从 UUID v7 字符串中提取时间戳?
这有效:
SELECT to_timestamp(x'0187296000797352b8a70b7088b46d0f'::bit(48)::bigint / 1000);
给出“2023-03-28 17:50:52”
这可以抽象为:
CREATE OR REPLACE FUNCTION extract_timestamp_from_uuid_v7(uuid_v7 UUID)
RETURNS TIMESTAMP AS $$
SELECT to_timestamp(('x'||replace(uuid_v7::text, '-', ''))::bit(48)::bigint / 1000) AS result;
$$ LANGUAGE sql IMMUTABLE;
对于存储为 BIN(16) 的 MariaDB 和 UUIDv7,您可以使用以下函数:
DELIMITER $$
CREATE DEFINER=`ksn135`@`localhost` FUNCTION `ts_from_uuid`(`b` BINARY(16)) RETURNS timestamp
BEGIN
RETURN FROM_UNIXTIME(
CAST(
CONV(
SUBSTRING(HEX(b),1,12),
16,
10
)
/ 1000 AS UNSIGNED
)
);
END$$
DELIMITER ;
用途:
SELECT id, mysql.ts_from_uuid(id) FROM table1;