如何查询仅含未来时间段的有效DATERANGE数据?
筛选PostgreSQL中完全处于未来的daterange类型记录
需求场景
需要从validity表中查询出validity_dates字段(daterange类型)对应的时间段完全处于未来的记录ID。例如示例数据中,id5的有效期[2024-01-01,2026-12-10)完全在未来,是目标结果;而id4的范围包含当前日期,不符合要求。
表结构示例
validity table id | validity_dates -------------+------------------------- 1 | [2018-01-01,2019-01-01) 2 | [2017-05-01,2017-06-01) 3 | [2016-05-01,2016-07-01) 4 | [2022-01-01,2025-01-01) 5 | [2024-01-01,2026-12-10)
无效的当前查询
当前查询仅能返回包含当前日期的范围记录,无法筛选完全未来的区间:
SELECT id FROM validity WHERE current_date <@ validity_dates
优化后的查询方案
利用PostgreSQL为daterange类型提供的lower()函数获取区间起始值,判断起始值是否晚于当前日期,即可确保整个区间完全处于未来:
SELECT id FROM validity WHERE lower(validity_dates) > current_date;
逻辑说明
lower(validity_dates):提取daterange字段的左边界(起始日期)- 当起始日期大于
current_date时,整个区间的所有日期都在当前日期之后,满足"完全处于未来"的要求 - 该逻辑不受daterange的边界类型(如左闭右开、全闭等)影响,只要起始点在未来,整个区间就不会包含当前及之前的日期
内容的提问来源于stack exchange,提问作者Panface
相关产品推荐
相关产品推荐

