首页 > 解决方案 > 如何在 Postgresql 日期之间进行选择并列出所有这些日期

问题描述

所以,我有这张桌子,我们就叫它吧product

============================================
sku  || valid_from ||  valid_to  || price ||
============================================
AAA  || 2021-01-26 || 2021-01-31 || 20000 ||
AAA  || 2021-02-01 || 2021-02-15 || 15000 ||
AAB  || 2021-02-27 || 2021-02-05 || 30000 ||
AAC  || 2021-01-28 || 2021-02-06 || 25000 ||
============================================

我想通过代码在一系列日期之间进行选择,并列出从该范围开始到结束的所有价格,如下所示:

(例如:select by sku= 'AAA',从 2021-01-26 到 2021-02-02)预期输出:

===============================
    date    || sku  || price ||
===============================
2021-01-26  || AAA  || 20000 ||
2021-01-27  || AAA  || 20000 ||
2021-01-28  || AAA  || 20000 ||
2021-01-29  || AAA  || 20000 ||
2021-01-30  || AAA  || 20000 ||
2021-01-31  || AAA  || 20000 ||
2021-02-01  || AAA  || 15000 ||
2021-02-02  || AAA  || 15000 ||
===============================

任何人都可以提供帮助吗?做数据库查询绝对不是我的强项:/

标签: postgresql

解决方案


您可以使用generate_series()将日期范围“分解”为行列表,然后在所需的日期对其进行过滤:

select p.sku, g.dt::date, p.price
from product p
  cross join generate_series(p.valid_from, p.valid_to, interval '1 day') as g(dt)
where sku = 'AAA'
  and g.dt::date between date '2021-01-26' and date '2021-02-02'

这可以通过添加另一个 WHERE 条件来提高效率,该条件只选择实际落入所需范围的行

  and daterange(valid_from, valid_to) && daterange(date '2021-01-26', date '2021-02-02', '[]')

对于给定的示例数据,它不会产生影响,因为 SKU 的所有行都AAA属于该范围


推荐阅读