从 PostgreSQL 中的 v1 UUID 转换或提取时间戳

2024-03-06

我正在尝试从 a 中提取时间戳版本 1 UUID https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address),天真地希望这能奏效:

SELECT '3efe0a20-f1b3-11e3-bb44-14109fec739e'::uuid::timestamp;

这是一个简单的示例,展示了如何在 Go 中提取时间,但我希望 PostgreSQL 有内置的东西,而不是创建一次性的 PL/pgSql 函数:
http://play.golang.org/p/XRCooLgfaG http://play.golang.org/p/XRCooLgfaG


我已经使用数据库中的 uuid 对此进行了测试,即使没有未签名的 bigint,它似乎也运行得很好

CREATE FUNCTION uuid_timestamp(id uuid) RETURNS timestamptz AS $$
  select TIMESTAMP WITH TIME ZONE 'epoch' +
      (((('x' || lpad(split_part(id::text, '-', 1), 16, '0'))::bit(64)::bigint) +
      (('x' || lpad(split_part(id::text, '-', 2), 16, '0'))::bit(64)::bigint << 32) +
      ((('x' || lpad(split_part(id::text, '-', 3), 16, '0'))::bit(64)::bigint&4095) << 48) - 122192928000000000) / 10000000 ) * INTERVAL '1 second';    
$$ LANGUAGE SQL
  IMMUTABLE
  RETURNS NULL ON NULL INPUT;

我在2099年的未来创建的一个V1 uuid!

select uuid_timestamp('6d248400-65b7-1243-a57a-14109fec739e');
uuid_timestamp     
------------------------
 2099-08-01 11:30:00-07
(1 row)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 PostgreSQL 中的 v1 UUID 转换或提取时间戳 的相关文章

随机推荐