2012-09-22 83 views
4

这与Getting date list in a range in PostgreSQL有些类似,但不完全相同(我认为)。Postgres SQL:表格具有开始日期和结束日期列时获得每个日期的一个结果

我有一个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 

我意识到,唯一和主键列,将在此结果集被复制,但是这不要紧,我。任何想法都会非常受欢迎!

回答

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与时间戳工作,但你可以伪造它通过使用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'以匹配您的数据。

+0

这看起来很整洁(当然,我必须首先对它进行基准测试),但是我的Postgres 8.3安装使用'generate_series'出现错误。我是否需要额外的选项,扩展或库?我得到“ERROR:function generate_series(timestamp without time zone,timestamp without time zone,interval)”不存在。提示:没有函数匹配给定的名称和参数类型,您可能需要添加显式类型转换。 – Jens

+0

@Jens:8.3的['generate_series'](http://www.postgresql.org/docs/8.3/interactive/functions-srf.html#FUNCTIONS-SRF-SERIES)没有时间戳版本,但你可以在我的更新中伪造它。 –

相关问题