PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truyền hoặc trích xuất dấu thời gian từ v1 UUID trong PostgreSQL

Tôi đã thử nghiệm điều này với uuid's từ cơ sở dữ liệu của mình và nó có vẻ hoạt động rất tốt, ngay cả khi không có bigints chưa được ký

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;

uuid V1 mà tôi đã tạo trong tương lai 2099!

select uuid_timestamp('6d248400-65b7-1243-a57a-14109fec739e');
uuid_timestamp     
------------------------
 2099-08-01 11:30:00-07
(1 row)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mặc định cho cột xxxx không thể được truyền tự động để nhập boolean trong Postgres DB

  2. Hàng sẽ không bị xóa vì trình kích hoạt tầng cập nhật hàng này

  3. Kiểm tra đơn vị Django không thành công cho nhiều lược đồ Postgres

  4. Postgres Chèn vào quy tắc xem với mệnh đề trả lại

  5. Nối hai bảng trong một truy vấn phức tạp (không phải dữ liệu thống nhất)