2016-06-08 91 views
8

göre sırala. UUID v1 zaman damgasını sıralamak istiyorum. Şu andaPostgresql - Ben birincil anahtar olarak UUID v1 kullanıyorum UUID v1 zaman damgası

select id, title 
from table 
order by id desc 

gibi bir şey yaparsanız Postgresql UUID zaman damgası ile kayıt sıralamak, ama benim durumumda beklenmedik sıralama sonucu ile biter UUID dize gösterimi ile gelmez.

şey eksik veya bir şekilde inşa edilmiş bir Postgresql bunu yapmanın yok muyum?

+0

böyle bir şey denedi mi:

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

bir dizin bu konuda oluşturulabilir performansını artırmak için mi? 'select id :: timestamp, tablo hatasından ID :: timestamp desc' – Santhucool

+0

tarafından bana bir hata verir. HATA: zaman damgası için uuid türünü alamazsınız – user232343

+0

'uuid v1' kullanmak zorunlu mu? Ben uuid_generate_v4' denedim ve basitçe sorgunuzu iyi çalıştı. – Santhucool

cevap

10

zaman damgası, bir V1 UUID'si parçaları biridir. 1582-10-15 00:00'dan beri yüzlerce nanosaniye olarak onaltılık biçimde saklanır. Bu fonksiyon, bir zaman damgası özler:

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 Milâdi başlangıç ​​ve UNIX zaman damgası arasındaki aralıktır. Sorgunuzun olarak

:

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

Ve sadece "ham" damgası ile sipariş (ve unix çağ zaman damgası dönüştürmeden umurumda) istiyorsanız? –