Il timestamp è una delle parti di un UUID v1. Viene memorizzato in formato esadecimale a centinaia di nanosecondi dal 1582-10-15 00:00
. Questa funzione estrae il 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'intervallo tra l'inizio del calendario gregoriano e il timestamp Unix.
Nella tua query:
select id, title
from t
order by uuid_v1_timestamp(id) desc
Per migliorare le prestazioni di un indice può essere creato su che:
create index uuid_timestamp_ndx on t (uuid_v1_timestamp(id));
fonte
2016-06-16 12:19:07
Forse si è tentato qualcosa di simile? 'selezionare id :: timestamp, titolo dall'ordine di tabella per id :: timestamp desc' – Santhucool
che mi dà un errore. ERRORE: impossibile lanciare il tipo uuid su timestamp – user232343
E 'obbligatorio usare 'uuid v1'? Ho provato 'uuid_generate_v4' e ho semplicemente provato la tua query funziona perfettamente. – Santhucool