2012-09-22 142 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)沒有時間戳版本,但你可以在我的更新中僞造它。 –

相關問題