Re: temporal variants of generate_series() - Mailing list pgsql-hackers

From JEAN-PIERRE PELLETIER
Subject Re: temporal variants of generate_series()
Date
Msg-id BAY133-F22FB4C01C9185AD384E4D895420@phx.gbl
Whole thread Raw
In response to temporal variants of generate_series()  ("Andrew Hammond" <andrew.george.hammond@gmail.com>)
Responses Re: temporal variants of generate_series()  (Jim Nasby <decibel@decibel.org>)
List pgsql-hackers
Here's a shorter version:

On the date variant, I wasn't sure how to handle intervals with parts 
smaller than days:
floor, ceiling, round or error out
To get round, the last parameters of generate_series would be
extract('epoch' FROM '1 day'::interval)::bigint * round(extract('epoch' FROM 
$3) / extract('epoch' FROM '1 day'::interval))::bigint

CREATE OR REPLACE FUNCTION generate_series (   start_ts timestamptz,   end_ts timestamptz,   step interval
) RETURNS SETOF timestamptz
STRICT
LANGUAGE sql
AS $$
SELECT  'epoch'::timestamptz + s.i * '1 second'::interval AS "generate_series"
FROM  generate_series(       extract('epoch' FROM $1)::bigint,       extract('epoch' FROM $2)::bigint,
extract('epoch'FROM $3)::bigint  ) s(i);
 
$$;

CREATE OR REPLACE FUNCTION generate_series (   start_ts date,   end_ts date,   step interval
) RETURNS SETOF date
STRICT
LANGUAGE sql
AS $$
SELECT  ('epoch'::date + s.i * '1 second'::interval)::date AS "generate_series"
FROM  generate_series(       extract('epoch' FROM $1)::bigint,       extract('epoch' FROM $2)::bigint,
extract('epoch'FROM date_trunc('day', $3))::bigint -- does a floor  ) s(i);
 
$$;

Jean-Pierre Pelletier
e-djuster




pgsql-hackers by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: Sequential scans
Next
From: "JEAN-PIERRE PELLETIER"
Date:
Subject: Re: temporal variants of generate_series()