2016-06-08 24 views
8

Tôi đang sử dụng UUID v1 làm khóa chính. Tôi muốn sắp xếp trên dấu thời gian UUID v1. Ngay bây giờ nếu tôi làm điều gì đó nhưPostgresql - sắp xếp theo dấu thời gian UUID v1

select id, title 
from table 
order by id desc 

PostgreSQL không sắp xếp các bản ghi theo UUID dấu thời gian, nhưng theo đại diện chuỗi UUID, mà kết thúc với kết quả phân loại bất ngờ trong trường hợp của tôi.

Tôi có thiếu thứ gì đó hoặc không có cách nào được xây dựng để thực hiện điều này trong Postgresql?

+0

Bạn có cố gắng một cái gì đó như thế này? 'select id :: timestamp, tiêu đề từ thứ tự bảng theo id :: timestamp desc' – Santhucool

+0

cho tôi một lỗi. L ERI: không thể truyền uuid thành dấu thời gian – user232343

+0

Bắt buộc phải sử dụng 'uuid v1'? Tôi đã thử 'uuid_generate_v4' và chỉ cần thử truy vấn của bạn nó hoạt động tốt. – Santhucool

Trả lời

10

Dấu thời gian là một trong các phần của UUID phiên bản 1. Nó được lưu trữ ở định dạng hex dưới dạng hàng trăm nano giây kể từ 1582-10-15 00:00. Chức năng này chiết xuất timestamp:

create or replace function uuid_v1_timestamp (_uuid uuid) 
returns timestamp with time zone as $$ 

    select 
     to_timestamp(
      (
       ('x' || lpad(h, 16, '0'))::bit(64)::bigint::double precision - 
       122192928000000000 
      )/10000000 
     ) 
    from (
     select 
      substring (u from 16 for 3) || 
      substring (u from 10 for 4) || 
      substring (u from 1 for 8) as h 
     from (values (_uuid::text)) s (u) 
    ) s 
    ; 

$$ language sql immutable; 

select uuid_v1_timestamp(uuid_generate_v1()); 
     uuid_v1_timestamp  
------------------------------- 
2016-06-16 12:17:39.261338+00 

122192928000000000 là khoảng cách giữa sự bắt đầu của lịch Gregorian và dấu thời gian Unix.

Trong truy vấn của bạn:

select id, title 
from t 
order by uuid_v1_timestamp(id) desc 

Để cải thiện hiệu suất một chỉ số có thể được tạo ra trên rằng:

create index uuid_timestamp_ndx on t (uuid_v1_timestamp(id)); 
+0

Và nếu bạn muốn chỉ cần đặt hàng bởi dấu thời gian "nguyên" (và không quan tâm đến việc chuyển đổi nó thành dấu thời gian unix epoch)? –

Các vấn đề liên quan