[prev in list] [next in list] [prev in thread] [next in thread] 

List:       postgresql-general
Subject:    Re: Help with writing a generate_series(tsmultirange, interval)
From:       Adrian Klaver <adrian.klaver () aklaver ! com>
Date:       2021-07-31 19:49:39
Message-ID: 7aa77027-63c5-21df-181f-0852f9ceadf9 () aklaver ! com
[Download RAW message or body]

On 7/31/21 11:59 AM, François Beausoleil wrote:
> Hello all!
> 
> I'm excited for multi ranges, as they fit nicely into a scheduling app. What I'm \
> trying to express is something along the lines of  « Every weekday from 2021-08-01 \
> and 2021-10-01, from 9 AM to 8 PM, every 90 minutes  ». You can think of public \
> transit for the model. 
> Initially, I was going to create a table with every departure recorded, and was \
> going to refresh the table on every write to the parent table, but that means \
> maintaining many rows for every change to the schedule. Then, I remembered multi \
> ranges in PG14, and they fit nicely with what I had in mind. 
> Now that I can store the info I want, I'd like to iterate over the ranges, so I can \
> generate the exact departure times, something similar to this: 
> SELECT instant
> FROM generate_series(
> '{["2021-08-02 08:00:00","2021-08-02 11:00:00"),["2021-08-03 08:00:00","2021-08-03 \
> 20:00:00"]'} , interval '90 minutes') as instant;
> 
> 2021-08-02 08:00
> 2021-08-02 09:30
> — 2021-08-02 11:00 excluded as the range excludes its upper bound
> 2021-08-03 08:00:00
> 2021-08-03 09:30:00
> 2021-08-03 11:00:00
> 2021-08-03 12:30:00
> 2021-08-03 14:00:00
> 2021-08-03 15:30:00
> 2021-08-03 17:00:00
> 2021-08-03 18:30:00
> 2021-08-03 20:00:00 — included, as the upper bound is inclusive
> 
> That function doesn't exist, and I can't seem to find a function to iterate over a \
> multi range either. Does such a function exist? I'm specifically looking at \
> https://www.postgresql.org/docs/14/functions-range.html. 
> This is a toy application, a spike to see what's possible.
> 
> I wanted to avoid maintaining a table with hundreds of rows per route, if a route \
> runs frequently enough (every 10 minutes, 8 AM to 8 PM, over a year). Of course, I \
> can avoid refreshing the departures table if the schedule hasn't changed, but \
> still, preparing this table will not take a constant amount of time; e.g. it will \
> depend on the schedule's size. 
> Any tips appreciated!

How about:

SELECT
     *
FROM
     generate_series ('2021-08-02 08:00:00'::timestamp, '2021-08-02 
10:59:00'::timestamp, interval '90 minutes') AS instant
UNION
SELECT
     *
FROM
     generate_series ('2021-08-03 08:00:00'::timestamp, '2021-08-03 
20:00:00'::timestamp, interval '90 minutes') AS instant
ORDER BY instant;

  instant
---------------------
  2021-08-02 08:00:00
  2021-08-02 09:30:00
  2021-08-03 08:00:00
  2021-08-03 09:30:00
  2021-08-03 11:00:00
  2021-08-03 12:30:00
  2021-08-03 14:00:00
  2021-08-03 15:30:00
  2021-08-03 17:00:00
  2021-08-03 18:30:00
  2021-08-03 20:00:00

> François
> 
> 
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic