postgresql - 如何在 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 ||
===============================
任何人都可以提供帮助吗?做数据库查询绝对不是我的强项:/
解决方案
您可以使用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
属于该范围
推荐阅读
- discord.js - 无法向刚刚创建的频道发送消息
- android - Android sdkmanadger.bat 文件被删除(Unity 依赖)
- reactjs - 如何在浏览器中访问部署到阿里巴巴云的MERN应用
- spring - 如何在 Spring 中处理从 Service 到 Controller 的 Optional?
- javascript - 如何切换选定或单击的元素不是全部
- mysql - 需要帮助更新 mysql 表
- java - 无法理解 Java 溢出和编译错误逻辑
- javascript - 如何在js中声明具有自定义名称的var?
- c# - GridViewRow 上的条件背景基于 DataGrid 旁边的文本框值
- javascript - 尝试用纯 JavaScript 实现“位置:粘性”的替代方案