2013-08-09 12 views
4

я колонна tstzrange типа (метки времени с диапазоном часового пояса) и мне нужно обновить только верхнюю или нижнюю границу этой величины (и держать включено/эксклюзивные границы)Update нижняя/верхняя граница типа диапазона

I удалось изменить

(-infinity,infinity) 

с

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

и я

(-infinity, <current timestamp>) 

, но я не знаю, как держать границы из диапазона по умолчанию .. это изменило бы даже [] к ()

ответ

3

Я нашел функцию я пропустил, что можно сделать, как это

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 
     ) 
    ) 

Было бы лучше создать функцию для этого, возможно. Или есть ли другое (более простое/лучшее) решение?

1

Насколько я знаю, использование CASE WHEN ... - лучший способ получить оценки. Вот несколько простых пользовательских функций, которые возвращают границы диапазона для всех собственных типов диапазонов.

Предупреждение: Эти функции ведут себя удивительными способами, поскольку типы диапазонов ведут себя в sometimes surprising ways.

Встроенный типов диапазона int4range, int8range и DateRange все используют каноническую форму, которая включает в себя нижнюю границу и не включает верхнюю границу ; то есть, [).

И

Хотя '(]' указано здесь, на дисплее значение будет преобразуется в канонической форме, поскольку int8range представляет собой тип дискретный диапазон...

(выделено мной)

PostgreSQL позволяет канонизировать замкнутый диапазон от 1 до 10 в полуоткрытом диапазоне от 1 до 10 до 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; 
Смежные вопросы