PostgreSQL范围文档建议神奇时间戳
infinity
应该与省略边界值相同:
具有“无穷大”概念的元素类型可以将它们用作显式绑定值。例如,对于时间戳范围,
排除特殊时间戳值无穷大,而[today,infinity)
包括它,[today,infinity]
和[today,)
也是如此。[today,]
函数 lower_inf 和 upper_inf 分别测试范围的无限下限和上限。
然而,当使用
upper_inf
测试范围(或多范围)是否包含无穷大时,当 infinity
到位时,结果始终为 false:
SELECT * FROM (
SELECT 1 AS test, upper_inf('{(,)}'::tstzmultirange)
UNION SELECT 2, upper_inf('{(,infinity)}'::tstzmultirange)
UNION SELECT 3, upper_inf('{(,]}'::tstzmultirange)
UNION SELECT 4, upper_inf('{(,infinity]}'::tstzmultirange)
UNION SELECT 5, upper_inf('(,)'::tstzrange)
UNION SELECT 6, upper_inf('(,infinity)'::tstzrange)
UNION SELECT 7, upper_inf('(,]'::tstzrange)
UNION SELECT 8, upper_inf('(,infinity]'::tstzrange)
) AS cases ORDER BY test;
产品:
1 true
2 false
3 true
4 false
5 true
6 false
7 true
8 false
为什么?
Adrian Klaver正确指出了我错过的文档的另一部分:
upper_inf ( anyrange ) → boolean
Does the range have no upper bound? (An upper bound of Infinity returns false.)
upper_inf('(,)'::daterange) → t
因此,
upper_inf
测试是否显式设置了上限,而不是测试界限是什么。
Infinity 的意思是“无限”,所以上限(值)不存在,但是“时间戳”将无穷大定义为它的上限,所以从技术上来说,上限是存在的。