You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何infinity未被daterange包含?查询结果不符的技术疑问

为什么PostgreSQL的[2019-01-02, infinity] daterange不包含infinity日期?

这是PostgreSQL范围类型的特殊设计导致的——当你定义以上限为infinity的闭合区间时,PostgreSQL会自动将闭合边界转换为开边界,也就是说[2019-01-02, infinity]实际上等价于[2019-01-02, infinity),因此它不会包含infinity这个特殊日期值。

我们可以通过内置函数验证这一点:

SELECT 
  upper('[2019-01-02, infinity]'::daterange) AS upper_bound,
  upper_inc('[2019-01-02, infinity]'::daterange) AS is_upper_inclusive;

执行结果会是:

upper_bound | is_upper_inclusive
-------------+--------------------
 infinity    | f

能看到,虽然范围的上限值是infinity,但它的上限边界是不闭合的(is_upper_inclusive为false),所以infinity日期不会被包含在这个范围内。

你提到单独比较'infinity'::date = 'infinity'::date返回true,这是因为PostgreSQL将infinity视为一个相等的特殊值,但范围类型的包含逻辑和单纯的等值比较是不同的:daterange的[a, infinity)代表所有大于等于a的实际日期,而infinity本身是一个超出所有实际日期的标记值,不属于这个集合。

如果你的需求是判断一个日期要么在这个范围内,要么是infinity,可以用这样的查询来实现预期的结果:

SELECT 
  '[2019-01-02, infinity]'::daterange @> 'infinity'::date 
  OR 'infinity'::date = 'infinity'::date;

或者更简洁的写法:

SELECT 'infinity'::date >= lower('[2019-01-02, infinity]'::daterange);

这两个查询都会返回true,符合你的预期。

内容的提问来源于stack exchange,提问作者Eugen Konkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:27:28