2016-06-08 91 views
8

Używam UUID v1 jako klucz podstawowy. Chciałbym posortować na znaczniku czasu UUID v1. Teraz, jeśli mi się coś podobnegoPostgresql - sortuj według czasu UUID v1 znacznik czasu

select id, title 
from table 
order by id desc 

Postgresql nie posortować rekordy według UUID datownika, ale przez UUID ciąg znaków, który kończy się z nieoczekiwanego wyniku sortowania w moim przypadku.

Czy czegoś brakuje, czy nie ma wbudowanego sposobu, aby to zrobić w Postgresql?

+0

Czy próbowałeś coś takiego? 'wybierz id :: timestamp, tytuł z porządku tabeli według id :: timestamp desc' – Santhucool

+0

, który daje mi błąd. BŁĄD: nie można użyć typu uuid do znacznika czasu. – user232343

+0

Czy użycie "uuid v1" jest obowiązkowe? Próbowałem 'uuid_generate_v4' i po prostu wypróbowałem twoje zapytanie, działa poprawnie. – Santhucool

Odpowiedz

10

Znacznik czasu jest jedną z części UUID v1. Jest przechowywany w formacie szesnastkowym jako setki nanosekund od 1582-10-15 00:00. Funkcja ta pobiera znacznik czasu:

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 to przedział między początkiem kalendarza gregoriańskiego i timestamp Unix.

w zapytaniu:

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

Aby zwiększyć wydajność indeksu może być utworzony na tym:

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

A jeśli chcesz po prostu zamówić przez "surowy" znacznik czasu (i nie przejmujesz się jego konwersją do epoki unixowej)? –