这有点类似于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
我意识到唯一键和主键行将在此结果集中重复,但这对我来说无关紧要。任何想法都将非常受欢迎!
最佳答案
您可以加入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)
和以前一样,调整 0
、1096
和 '2010-01-01'
以匹配您的数据。
关于sql - PostgreSQL : Getting one result per date when table has start and end date columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12541289/