PostgreSQL tsrange:它是正确的lower_inf('( - 无穷,今天)':: tsrange)为假?
在编写接受来自用户的tsrange文字的程序,然后插入各种SQL查询的过程中,今天我正在测试一些tsrange以了解它们是如何被PostgreSQL 9.3.5解释的。PostgreSQL tsrange:它是正确的lower_inf('( - 无穷,今天)':: tsrange)为假?
这其中,尤其是行为异常: '(-infinity今天)' :: tsrange
的lower_inf功能说下界是不是无限
test=> SELECT lower_inf('(-infinity,today)'::tsrange);
lower_inf
-----------
f
(1 row)
然而,PostgreSQL的(!)报告这个tsrange包含一个像'1000-01-01 BC'这样的时间戳。 。 。
test=> SELECT '(-infinity,today)'::tsrange @> '1000-01-01 BC'::timestamp;
?column?
----------
t
(1 row)
任何人都可以阐明这一点吗?
这里的混淆源于两个不同含义的“无穷大”。
-
timestamp
类型接受special values forinfinity
and-infinity
。 - 范围类型对于没有下限/上限的范围具有一般概念。测试它的函数被称为
lower_inf()
andupper_inf()
,但它们实际上测试范围中的“没有界限”。范围没有上限/下限包括的值infinity
/对timestamp
-infinity
分别。
此外,一些元素类型具有“无限”的概念,但是这仅仅是 另一个值为止的范围类型的机制有关。例如,对于 示例,在时间戳范围内,
[today,]
的含义与[today,)
的含义相同。但[today,infinity]
意味着不同于[today,infinity)
- 后者排除了特殊时间戳值infinity
。
也许这些功能的确可以称为像lower_nobound()
和upper_nobound()
,以避免混淆...
很好地抓住并很好地解释。我应该已经意识到这是发生了什么,但是首先没有RTFM。 – 2014-11-24 15:24:29
事实上,我在文档中阅读了这段代码,但并不明白“无穷大只是另一个值”与区间是无界的不同。无限如何才能成为“仅仅是另一个价值”,[今天,无限]如何与[今天,无限]不同? – smithfarm 2014-11-24 15:38:58
@smithfarm:答案在文档中引用。 – 2014-11-24 16:04:20
看起来很可疑的bug报告证明给我。 – 2014-11-24 12:22:36
@CraigRinger:起初我也这么认为。但事实证明,这是有记录的。更像是一个不幸的双重使用术语“无穷大”。 – 2014-11-24 15:29:54