2014-11-24 27 views
4

在编写接受来自用户的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) 

任何人都可以阐明这一点吗?

+1

看起来很可疑的bug报告证明给我。 – 2014-11-24 12:22:36

+0

@CraigRinger:起初我也这么认为。但事实证明,这是有记录的。更像是一个不幸的双重使用术语“无穷大”。 – 2014-11-24 15:29:54

回答

6

这里的混淆源于两个不同含义的“无穷大”

  1. timestamp类型接受special values for infinity and -infinity
  2. 范围类型对于没有下限/上限的范围具有一般概念。测试它的函数被称为lower_inf() and upper_inf(),但它们实际上测试范围中的“没有界限”。范围没有上限/下限包括infinity /对timestamp-infinity分别。

Per documentation:

此外,一些元素类型具有“无限”的概念,但是这仅仅是 另一个值为止的范围类型的机制有关。例如,对于 示例,在时间戳范围内,[today,]的含义与 [today,)的含义相同。但[today,infinity]意味着不同于 [today,infinity) - 后者排除了特殊时间戳值infinity

SQL Fiddle.

也许这些功能的确可以称为像lower_nobound()upper_nobound(),以避免混淆...

+0

很好地抓住并很好地解释。我应该已经意识到这是发生了什么,但是首先没有RTFM。 – 2014-11-24 15:24:29

+0

事实上,我在文档中阅读了这段代码,但并不明白“无穷大只是另一个值”与区间是无界的不同。无限如何才能成为“仅仅是另一个价值”,[今天,无限]如何与[今天,无限]不同? – smithfarm 2014-11-24 15:38:58

+0

@smithfarm:答案在文档中引用。 – 2014-11-24 16:04:20