4

这有点类似于Getting date list in a range in PostgreSQL,但不完全相同(我认为)。

我有一个 SQL 表,其中每一行都包含一个开始和结束日期。我想形成一个查询,以便对于每一行,对于这个范围内的每个日期,我得到一个结果。

例如:id=1, title=MyRange, start=2012-08-05, end=2012-08-08

询问:SELECT * FROM myTyble where id=1 AND ...

结果:

 id=1, title=MyRange, date=2012-08-05
 id=1, title=MyRange, date=2012-08-06
 id=1, title=MyRange, date=2012-08-07
 id=1, title=MyRange, date=2012-08-08

我意识到唯一和主键行将在此结果集中重复,但这对我来说并不重要。任何想法都会非常受欢迎!

4

1 回答 1

5

generate_series您可以像从中选择一样轻松地加入。这样的事情应该可以解决问题:

select t.*
from generate_series('2010-01-01'::timestamp, '2013-01-01'::timestamp, '1 day') as s(d)
join your_table t on (s.d between t.start and t.end)

你会提供你想要的真实日期,而不是2010-01-01当然2013-01-01

较旧的版本,例如 8.3,没有generate_series与时间戳一起使用的 a,但您可以通过使用generate_series从初始日期生成日期偏移量来伪造它:

select t.*
from generate_series(0, 1096) dt(d)
join your_table t on ('2010-01-01'::date + dt.d between t.start and t.end)

和以前一样,调整01096'2010-01-01'以匹配您的数据。

于 2012-09-22T06:47:13.617 回答