在postgresql中从v1 uuid转换或提取timestamptz

 o0沢田纲吉0o 发布于 2023-01-09 16:29

我正试图从V1 uuid中提取时间戳,天真地希望这有效:

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

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

1 个回答
  • 我用我的数据库中的uuid测试了它,它似乎运行得很好,即使没有未签名的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)
    

    2023-01-09 16:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有