3

私はこれに相当するものが欲しいです:

create table t (
    fromts timestamptz, 
    tots timestamptz,
    exclude using gist ((fromts, tots) with overlaps)
);
ERROR:  syntax error at or near ","
LINE 4:         exclude using gist ((fromts, tots) with overlaps)

構文エラーに加えて、可換演算子ではないという問題もあると思います。

それを機能させる最も簡単な方法は何ですか?

4

2 に答える 2

4

これは最初は不自然に思えるかもしれませんが、箱から出してすぐに機能します(しゃれは意図されていません)。

@Quassnoiが私に見つけてくれたので、これはに対してのみ機能しtimestamptimestamptz:に対しては機能しません。

CREATE TABLE t (
    fromts timestamp, 
    tots   timestamp,
    exclude using GIST (box(point(EXTRACT(EPOCH FROM fromts), 0)
                          , point(EXTRACT(EPOCH FROM tots),   0)) WITH &&)
);

timestampタイプを明確にする前に、私のテストは-でした。EXTRACTとはありますが、IMMUTABLEtimestampはありませんtimestamptz。@Quassnoiは、その理由についての仮説を以下のコメントに投稿しました。

したがって、の場合、 @Quassnoiが彼の回答で示しているような補助関数を使用しtimestamp with time zoneて変換を行う必要があります。IMMUTABLE

Postgres9.2以降の場合

...この特定のケースでは、新しく導入された範囲タイプを使用できます。マニュアルには、除外制約のある完全なコード例が記載されています。tstzrange

于 2012-05-25T19:05:58.987 に答える
3

PostgreSQL除外制約が機能するには、名前付きタイプと演算子クラスが必要です。では9.1RANGEまだ実装されていません。

独自に定義することもできますが、これにはスーパー特権が必要です(つまり、ホストされているデータベースなどでは機能しません)。

&&タイムスタンプをボックスにキャストし、intersects演算子( )を使用して制約を定義してみてください。

CREATE FUNCTION ts_to_box(TIMESTAMPTZ, TIMESTAMPTZ)
RETURNS BOX
AS
$$
    SELECT  BOX(POINT(DATE_PART('epoch', $1), -1), POINT(DATE_PART('epoch', $2), 1))
$$
LANGUAGE 'sql'
IMMUTABLE;

CREATE TABLE t (
    fromts timestamptz, 
    tots timestamptz,
    EXCLUDE USING GIST (ts_to_box(fromts, tots) WITH &&)
);
于 2012-05-25T19:03:22.277 に答える