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));
Nguồn
2016-06-16 12:19:07
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
cho tôi một lỗi. L ERI: không thể truyền uuid thành dấu thời gian – user232343
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