Re: Assigning values to a range in Pgsql and inclusive / exclusivebounds - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Assigning values to a range in Pgsql and inclusive / exclusivebounds
Date
Msg-id 426cbd6e-f696-05a0-8d06-3275bb0d851a@aklaver.com
Whole thread Raw
In response to Assigning values to a range in Pgsql and inclusive / exclusive bounds  (Ron Clarke <rclarkeai@gmail.com>)
Responses Re: Assigning values to a range in Pgsql and inclusive / exclusive bounds  (Ron Clarke <rclarkeai@gmail.com>)
List pgsql-general
On 6/12/20 11:45 AM, Ron Clarke wrote:
> Hi,
> 
> I've got a simple problem, but I'm convinced that there must be an 
> elegant solution. I'm a refugee from the world of MSSQL, so I'm still 
> finding some aspects of PostgreSQL alien.
> 
> I'm trying to use the /tstzrange /datatype. My issue is correctly 
> setting the bound types when assigning values to a range in code (PGSQL).
> 
> So if i declare this : e.g.
> 
>     /declare tx tstzrange := '[today, tomorrow)' ;/
> 
> 
> I get the variable tx as expected with the Inclusive '[' lower bound and 
> exclusive upper ')' bound.
> 
> But if I attempt to reassign the value in code within pgsql I can do 
> this simply, only with '(' syntax for the lower bound i.e. with an 
> exclusive lower bound, e.g so this works:-
> 
>     /tx= (Timestamptz 'today', timestamptz 'now' + interval '1 hour');/
> 
> but if I try
> /tx= [Timestamptz 'today', timestamptz 'now' + interval '1 hour'); /
> /
> /
> this will have syntax errors - as the hidden 'select [' upsets the 
> parser.   I've tried to include a '[)' in variations of the expression, 
> but just get various syntax errors..
> 
> I've tried many combinations and I can get it to work using casts and 
> concatenations, e.g. :-
> 
>     / tx = CONCAT('[', 'today'::Timestamptz,',',('now' ::Timestamptz +
>     interval '1 hour'):: timestamptz , ')'):: tstzrange ;/
> 
> works but I can't help thinking that I'm missing something much simpler 
> and more elegant.
> How should this actually be done?

Realized what you want is:

select tstzrange('today', ('now'::timestamptz + interval '1 hour'), '[)');
                           tstzrange
--------------------------------------------------------------
  ["06/12/2020 00:00:00 PDT","06/12/2020 13:59:27.554229 PDT")


tx tstzrange := tstzrange('today', ('now'::timestamptz + interval '1 
hour'), '[)') ;

> 
> Thanks in advance for your advice.
> 
> Ron
> Stay safe everyone.
> 
> 
> here's an example script to show what I mean:-
> 
>     /do
>     //$$
>     //DECLARE
>     /
> 
>         /tx tstzrange := '[today, tomorrow)' ;/
> 
>         /answer text;/
> 
>     /BEGIN
>     /
> 
>         /RAISE NOTICE 'Start %', tx;/
> 
>         /answer = tx @> 'today'::Timestamptz;/
> 
>         /RAISE NOTICE 'today  %', answer;/
> 
>         /answer = tx @> 'tomorrow'::Timestamptz;/
> 
>         /RAISE NOTICE 'tomorrow  %', answer;/
> 
>         /-- ( works
>         -- tx= (Timestamptz 'today', timestamptz 'now' + interval '1 hour');
>         /-- [ doesn't work
>         -- tx= [Timestamptz 'today', timestamptz 'now' + interval '1 hour');
>         -- working around the parser??
>         /tx = CONCAT('[', 'today'::Timestamptz,',',('now' ::Timestamptz
>         + interval '1 hour'):: /timestamptz , ')'):: tstzrange ;
> 
>         /RAISE NOTICE 'reassign  %', tx;/
> 
>         /answer = tx @> 'today'::Timestamptz;/
> 
>         /RAISE NOTICE 'today  %', answer;/
> 
>         /answer = tx @> 'now'::Timestamptz;/
> 
>         /RAISE NOTICE 'now    %', answer;/
> 
>     /END;/
>     /$$ /
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com



pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Assigning values to a range in Pgsql and inclusive / exclusivebounds
Next
From: Rene Romero Benavides
Date:
Subject: Re: ansible modules for postgresql installation/config