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

Gaj*_*jus 3 postgresql

UUID v7 定义为:

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

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

Gaj*_*jus 6

这有效:

SELECT to_timestamp(x'0187296000797352b8a70b7088b46d0f'::bit(48)::bigint / 1000);
Run Code Online (Sandbox Code Playgroud)

给出“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;
Run Code Online (Sandbox Code Playgroud)