Re: How to update upper-bound of tstzrange ?

From: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
To: Erik Wienhold <ewie(at)ewie(dot)name>, Laura Smith <n5d9xq3ti233xiyif2vp(at)protonmail(dot)ch>
Cc: postgre <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: How to update upper-bound of tstzrange ?
Date: 2024-05-21 10:02:56
Message-ID: 82f02004dc5fd734c925d4db0c48190e8100a42d.camel@cybertec.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, 2024-05-20 at 13:56 +0200, Erik Wienhold wrote:
> On 2024-05-20 12:30 +0200, Laura Smith wrote:
> > Could someone kindly help me out with the correct syntax ?
> >
> > My first thought was the below but that doesn't work:
> >
> > update foo set upper(bar_times)=upper(bar_times)+interval '1' hour where bar_id='abc';
> > ERROR: syntax error at or near "("
> > LINE 1: update event_sessions set upper(bar_times)=upper(bar_ti...
>
> Use the constructor function:
>
> UPDATE foo SET bar_times = tstzrange(lower(bar_times), upper(bar_times) + interval '1' hour);
>
> But this does not preserve the inclusivity/exclusivity of bounds from
> the input range, so you may have to pass in the third argument as well.
>
> https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-CONSTRUCT

If you need to preserve the information whether the upper and lower bounds
are inclusive or not, you could

UPDATE foo
SET bar_times = tstzrange(
lower(bar_times),
upper (bar_times) + INTERVAL '1 hour',
CASE WHEN lower_inc(bar_times) THEN '[' ELSE '(' END ||
CASE WHEN upper_inc(bar_times) THEN ']' ELSE ')' END
)
WHERE ...

Yours,
Laurenz Albe

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Laurenz Albe 2024-05-21 10:09:19 Re: problem with query
Previous Message Ron Johnson 2024-05-20 20:10:37 Re: pg_dump and not MVCC-safe commands