postgresql - 为什么 `infinity` 不包含在范围内?

标签 postgresql range

我有上限为无穷大的范围。

为什么这个范围不包含无穷大?

我希望这会返回 true:

=> select '[2019-01-02, infinity]'::daterange @> 'infinity'::date;
 ?column? 
----------
 f
(1 row)

因为:

=> select 'infinity'::date = 'infinity'::date;
 ?column? 
----------
 t
(1 row)

最佳答案

The documentation说:

Also, some element types have a notion of “infinity”, but that is just another value so far as the range type mechanisms are concerned. For example, in timestamp ranges, [today,] means the same thing as [today,). But [today,infinity] means something different from [today,infinity) — the latter excludes the special timestamp value infinity.

这似乎与您的观察完全矛盾,因为

SELECT 'infinity'::date;
   date   
----------
 infinity
(1 row)

对此行为的解释是 PostgreSQL 将“离散”类型(dateinteger 类型)的范围转换为它们的“规范”表示:

SELECT '[2010-01-01,2010-02-28]'::daterange;
        daterange        
-------------------------
 [2010-01-01,2010-03-01)
(1 row)

这就是您的示例中发生的情况:PostgreSQL 将 infinity 加 1(这不会更改值)并将包含上限转换为独占上限。

现在可以说这不是正确的行为,因为现在 infinity 不再是区间的一部分。我已经为此发送了一个补丁,并用 commit e6feef571a 修复了它.

关于postgresql - 为什么 `infinity` 不包含在范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55905326/

相关文章:

sql - 限制 postgreSQL 更新命令

postgresql - 如何从已执行的准备语句中获取 $1 参数的值(在使用 current_query() 的触发器内)

python - 使用 SQLAlchemy 从 PostgreSQL 行对象获取单个值

javascript - Range startContainer 不是最深的节点

Javascript 将数组划分为多个范围

r - 如何获取包含两个其他值之间的值的数据框行?

postgresql - Postgres 扩展创建

postgresql - postgres 将 2 列合并为 1

python - 如何同时实现 2 个 python 范围函数?

c - 在 C 中,如何将 scanf 的分隔符设置为非字母的任何内容?