扩展Postgresql列中的日期范围

时间:2012-03-07 19:38:58

标签: postgresql date range

这个可能比我做的简单得多。我必须查询具有这样的基本布局的表

(productNumber varchar, firstYearAvailable int, lastYearAvailable int, ...)

例如

(12345, 2004, 2006, ...),
(22293b, 2009, 2011, ...),
(a7564n, 2007, 2010, ...),
etc.

通过一系列复杂的连接,在与其他表一起的函数中查询此表。截至目前,查询是这样的

SELECT field1, field2, productNumber, firstYearAvailable, lastYearAvailable, ...
FROM ...
JOIN ...
WHERE ...
etc.

不是为每个产品(第一年 - 去年)返回年份范围,而是为每个产品返回每年的条目更有用(firstYear,firstYear + 1,...,lastYear) 。例如,假设产品编号是12345,该产品的范围是2004-2006,那么查询应该返回该产品和那两列。

(12345,2004),
(12345,2005),
(12345,2006)

还有一个细节使得此查询特别困难,查询会搜索多个零件编号,并且每个零件编号可能具有不同的年份范围。

有没有人有关于如何解决这个问题的任何提示?我愚弄了循环和连接,并通过条件动态生成SQL语句,但这些都没有效果。

希望我提供了足够的信息,但如果我没有,请问。

由于

1 个答案:

答案 0 :(得分:6)

功能generate_series(start int, stop int)是您的答案:

create temporary table product_years
  (productNumber varchar, firstYearAvailable int, lastYearAvailable int);

insert into product_years values
  ('12345', 2004, 2006),
  ('22293b', 2009, 2011),
  ('a7564n', 2007, 2010);

select
    productNumber,
    generate_series(firstYearAvailable,lastYearAvailable) as productYear
  from product_years;

 productnumber | productyear
---------------+-------------
 12345         |        2004
 12345         |        2005
 12345         |        2006
 22293b        |        2009
 22293b        |        2010
 22293b        |        2011
 a7564n        |        2007
 a7564n        |        2008
 a7564n        |        2009
 a7564n        |        2010
(10 rows)