在postgresql中从v1 uuid中铸造或提取timestamptz[英] Cast or extract timestamptz from v1 uuid in postgresql

本文是小编为大家收集整理的关于在postgresql中从v1 uuid中铸造或提取timestamptz的处理方法,想解了在postgresql中从v1 uuid中铸造或提取timestamptz的问题怎么解决?在postgresql中从v1 uuid中铸造或提取timestamptz问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试从 V1 uuid 中提取时间戳,天真地希望这能奏效:

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

这是一个快速示例,展示了如何提取运行时间,但我希望 postgresql 有内置的东西,而不是创建一次性的 pl/pgSql 函数.http://play.golang.org/p/XRCooLgfaG

推荐答案

我已经用我的数据库中的 uuid 对此进行了测试,它似乎工作得很好,即使没有 unsigned bigints

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)

本文地址:https://www.itbaoku.cn/post/1763742.html