如何从UUID v7中提取时间戳?

问题描述 投票:0回答:2

UUID v7 定义为:

前 48 位是自 Unix 纪元以来的大端无符号毫秒数。接下来的 4 位是版本位 (0111),后面是 12 位伪随机数据。

如何从 UUID v7 字符串中提取时间戳?

postgresql
2个回答
8
投票

这有效:

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;

0
投票

对于存储为 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;
© www.soinside.com 2019 - 2024. All rights reserved.