Обсуждение: using possibly null timestamptz columns

Поиск
Список
Период
Сортировка

using possibly null timestamptz columns

От
James Cloos
Дата:
Given a table with a pair of timestamptz columns (lets call them s and e)
which are typically null, is there a better way to write this where clause
snippet:
   where ( s is null or s <= now() ) and ( e is null or e >= now() )

In particular I hope to ensure efficient indexes.

-JimC
-- 
James Cloos <cloos@jhcloos.com>         OpenPGP: 0x997A9F17ED7DAEA6



Re: using possibly null timestamptz columns

От
Tom Lane
Дата:
James Cloos <cloos@jhcloos.com> writes:
> Given a table with a pair of timestamptz columns (lets call them s and e)
> which are typically null, is there a better way to write this where clause
> snippet:

>     where ( s is null or s <= now() ) and ( e is null or e >= now() )

You could try constructing a GIST or SPGIST index on the ranges
tstzrange(s, e), where you'd have to do something to convert null
endpoints to infinities, and then probing with WHERE rangeexpr @> now().

I'm not really sure how well this would perform, but certainly you're
dead in the water as far as doing anything useful with regular btree
indexes.
        regards, tom lane



Re: using possibly null timestamptz columns

От
Tom Lane
Дата:
I wrote:
> You could try constructing a GIST or SPGIST index on the ranges
> tstzrange(s, e), where you'd have to do something to convert null
> endpoints to infinities, and then probing with WHERE rangeexpr @> now().

Or actually, it looks like tstzrange() already does the right thing:

regression=# select tstzrange(now(), null);            tstzrange             
-----------------------------------["2016-09-29 09:12:14.79429-04",)
(1 row)

regression=# select tstzrange(null, now());            tstzrange              
------------------------------------(,"2016-09-29 09:12:33.632327-04")
(1 row)

So this just reduces to WHERE tstzrange(s, e) @> now().
        regards, tom lane



Re: using possibly null timestamptz columns

От
James Cloos
Дата:
>>>>> "TL" == Tom Lane <tgl@sss.pgh.pa.us> writes:

TL> So this just reduces to WHERE tstzrange(s, e) @> now().

Thank you!  I forgot about the range types.

I may even switch to a single range column instead of the separate start
and end columns.

-JimC
-- 
James Cloos <cloos@jhcloos.com>         OpenPGP: 0x997A9F17ED7DAEA6