11

タイプ(タイムゾーン範囲のタイムスタンプ)の列がtstzrangeあり、この値の上限または下限のみを更新する必要があります(包含/排他境界を維持します)

なんとか変えました

(-infinity,infinity)

UPDATE table
SET
    my_column = tstzrange(
        lower(my_column),
        now(),
        '()'
    )

そして、私が持っています

(-infinity, <current timestamp>)

しかし、境界をデフォルトの範囲から維持する方法がわかりません..これは[ ]( )

4

3 に答える 3

9

見逃していた機能を見つけました。このようにすることは可能です

UPDATE table
SET
    my_column = tstzrange(
        lower(my_column),
        now(),
        concat(
            CASE WHEN lower_inc(my_column) THEN '[' ELSE '(' END,
            CASE WHEN upper_inc(my_column) THEN ']' ELSE ')' END
        )
    )

これはおそらく関数を作成する方がよいでしょう。または、他の(より単純な/より良い)解決策はありますか?

于 2013-08-09T12:17:51.357 に答える
3

私の知る限り、 CASE WHEN... を使用することが境界を取得する最良の方法です。すべてのネイティブ範囲型の範囲境界を返すいくつかの単純なユーザー定義関数を次に示します。

警告:これらの関数は驚くべき方法で動作します

組み込みの範囲型int4range、int8range、および daterangeはすべて、下限を含み上限を除外する標準形式を使用します。あれは、 [)。

ここでは '(]' が指定されていますが、int8range は離散範囲型であるため、表示される値は標準的な形式に変換されます. . .

(強調追加)

PostgreSQL は、1 から 10 までの閉じた範囲を 1 から 11 までの半分開いた範囲として正規化します。

select int4range('[1,10]');
[1,11)

左側が半分開いている範囲についても同じことが行われます。

select int4range('(1,10]');
[2,11)

range_bounds() は、入力ではなく結果の境界を返します。

select range_bounds(int4range('(1,10]'));
[)

機能

create or replace function range_bounds(in range int4range)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;

create or replace function range_bounds(in range int8range)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;

create or replace function range_bounds(in range numrange)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;


create or replace function range_bounds(in range tsrange)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;

create or replace function range_bounds(in range tstzrange)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;

create or replace function range_bounds(in range daterange)
returns char(2) as 
$$
select case when lower_inc(range) then '[' else '(' end ||
       case when upper_inc(range) then ']' else ')' end;
$$
language sql
returns null on null input;
于 2013-08-10T12:40:29.857 に答える