2017-11-05 7 views
2

を除外するための範囲は、私は次の表を持っています。Postgresの「タイムゾーンのない時間」と制約

私は次のことを試してみました:

alter table booking add constraint overlapping_times 
exclude using gist 
(
    cast(room as text) with =, 
    period(start_time, end_time) with &&) 
); 

これは二つの問題がありますERROR: data type text has no default operator class for access method "gist"を:textroomキャスト

  • は、それが与える、十分ではありません。私はv10の中にbtree_gistがあることを知っていますが、v9.5とv9.6を使用していますので、手動でuuidtext afaikにキャストしなければなりません。

  • period(...)が間違っていますが、time without time zoneタイプの範囲をどのように構築するかわかりません。 installingbtree_gist

答えて

2

、次の操作を実行できます。

create type timerange as range (subtype = time); 

alter table booking add constraint overlapping_times 
exclude using gist 
(
    (room::text) with =, 
    timerange(start_time, end_time) with && 
); 

あなたは括弧の中にそれを配置する必要があり制約で表現をしたい場合。だからいずれか(room::text)または(cast(room as text))

+0

ありがとう、これは動作します! v10では、 'btree_gist'が' uuid'型をサポートしているので、そのキャストを削除することができます。 –

+0

私はあなたがカスタムレンジを構築できるかどうか分かりませんでした。カッコいい! –

関連する問題