Re: temporal variants of generate_series()
От | David Fetter |
---|---|
Тема | Re: temporal variants of generate_series() |
Дата | |
Msg-id | 20070501220530.GI31114@fetter.org обсуждение исходный текст |
Ответ на | Re: temporal variants of generate_series() (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-hackers |
On Tue, May 01, 2007 at 05:08:45PM -0400, Tom Lane wrote: > Jim Nasby <decibel@decibel.org> writes: > > Are you sure the case statements are needed? It seems it would be > > better to just punt to the behavior of generate_series (esp. if > > generate_series eventually learns how to count backwards). > > What's this "eventually"? > > regression=# select * from generate_series(10,1,-1); > generate_series > ----------------- > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2 > 1 > (10 rows) > > regards, tom lane Good point. I believe the function below does the right thing. When given decreasing TIMESTAMPTZs and a negative interval, it will generate them going backward in time. When given increasing TIMESTAMPTZs and a positive interval, it will generate them going forward in time. Given a 0 interval, it errors out, although not with the same message as generate_series(1,1,0), and decreasing TIMESTAMPTZs and a positive interval or vice versa, it generates no rows. CREATE OR REPLACE FUNCTION generate_series ( start_ts timestamptz, end_ts timestamptz, step interval ) RETURNS SETOF timestamptz STRICT LANGUAGE sql AS $$ SELECT $1 + s.i * $3 AS "generate_series" FROM generate_series( CASE WHEN $1 <= $2 THEN 0 ELSE floor( ( extract('epoch' FROM$2) - extract('epoch' FROM $1) )/extract('epoch' FROM $3) )::int8 END, CASE WHEN $1 <= $2 THENceil( ( extract('epoch' FROM $2) - extract('epoch' FROM $1) )/extract('epoch' FROM$3) )::int8 ELSE 0 END, sign( extract('epoch' FROM $2) - extract('epoch' FROM $1) )::int8 ) AS s(i) ORDER BY s.i ASC ; $$; -- David Fetter <david@fetter.org> http://fetter.org/ phone: +1 415 235 3778 AIM: dfetter666 Skype: davidfetter Remember to vote! Consider donating to PostgreSQL: http://www.postgresql.org/about/donate
В списке pgsql-hackers по дате отправления: