【问题标题】:Expanding Date Ranges in a Postgresql Column在 Postgresql 列中扩展日期范围
【发布时间】:2012-03-07 19:38:57
【问题描述】:

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

(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 语句,但这些都没有效果。

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

谢谢

【问题讨论】:

  • 加入日历 - 表格?

标签: postgresql date range


【解决方案1】:

函数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;

 产品编号 |产品年
---------------+-------------
 12345 | 2004年
 12345 | 2005年
 12345 | 2006年
 22293b | 2009
 22293b | 2010
 22293b | 2011
 a7564n | 2007年
 a7564n | 2008年
 a7564n | 2009
 a7564n | 2010
(10 行)

【讨论】:

  • 难以置信!似乎我所有的棘手问题都可以通过简单的函数调用来解决。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2020-11-18
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
相关资源
最近更新 更多